编辑器用于在没有BeginForm的情况下不呈现数据验证属性

本文关键字:数据 属性 验证 情况下 用于 BeginForm 编辑器 | 更新日期: 2023-09-27 17:59:39

在MVC应用程序中,我想动态地呈现表单的某些部分(类似于控制器端的PartialView)

在局部视图中,我没有Html.BeginForm(),因为表单标记已经呈现。

@model Introduction.Models.Human
<div>
    @Html.EditorFor(model => model.MarriageInformation.SpouseDetails)
    <div class="editor-label">
        @Html.LabelFor(model => model.MarriageInformation.DOM)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.MarriageInformation.DOM)
        @Html.ValidationMessageFor(model => model.MarriageInformation.DOM)
    </div>
</div>

在这种情况下,我面临的问题是EditorFor不会返回所有的数据val-*属性。

<div>
   <div class="editor-label">
    <label for="MarriageInformation_SpouseDetails_Name">Name</label>
</div>
<div class="editor-field"><input class="text-box single-line" id="MarriageInformation_SpouseDetails_Name" name="MarriageInformation.SpouseDetails.Name" type="text" value="" /> 

这是故意的还是我遗漏了什么?这附近有工作吗?

我正在考虑的选项是在ajax加载后剥离表单并注入内部内容。

编辑器用于在没有BeginForm的情况下不呈现数据验证属性

您认为这是设计的,这是正确的。如果你检查来源,你会看到以下内容:

// Only render attributes if unobtrusive client-side validation is enabled, and then only if we've
// never rendered validation for a field with this name in this form. Also, if there's no form context,
// then we can't render the attributes (we'd have no <form> to attach them to).
public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)

为了解决这个问题,我们可以编写一个扩展方法用于我们的局部视图:

public static class HtmlExtentions
{
    public static void EnablePartialViewValidation(this HtmlHelper helper)
    {
        if (helper.ViewContext.FormContext == null)
        {
            helper.ViewContext.FormContext = new FormContext();
        }
    }
}

然后在我们的局部视图中使用它:

@model Introduction.Models.Human
@{ Html.EnablePartialViewValidation(); }
<div>
    @Html.EditorFor(model => model.MarriageInformation.SpouseDetails)
    <div class="editor-label">
        @Html.LabelFor(model => model.MarriageInformation.DOM)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.MarriageInformation.DOM)
        @Html.ValidationMessageFor(model => model.MarriageInformation.DOM)
    </div>
</div>

最后一步是处理解析ajax回调中的新验证属性:

$(function () {
    $('button').click(function (e) {
        e.preventDefault();
        $.get('@Url.Action("AddSpouse")', function (resp) { 
            var $form = $('form');
            $form.append(resp);                    
            $form.removeData("validator").removeData("unobtrusiveValidation");
            $.validator.u‌​nobtrusive.parse($form);
        })
    })
});

如果希望数据验证标记在那里,则需要在FormContext中。因此,如果您正在动态生成表单的部分,则需要在部分视图中包含以下行:

@{ if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext(); }}

然后,您需要确保每次添加/删除项目时都动态地重新绑定您的不引人注目的验证:

$("#form").removeData("validator");
$("#form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("#form");