无法进行jquery验证以使用动态mvc Html帮助程序

时间:2014-05-28 08:32:45

标签: c# validation razor model-binding asp.net-mvc-5.1

我从数据库生成一个表单,我想使用mvc htmlhelpers来帮助我。令人惊讶的是,这很好用。

@model Models.MyViewModelWithACollectionOfFormElements

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @foreach (var item in Model.FormItems)
    {
        @Html.Editor(item.Name, item.EditorTemplate, item.HtmlAttributes)

        // "validate_" gets prefixed before the 'id' and 'name' attributes.
        @Html.ValidationMessage(item.Name, item.GetHtmlAttributes("validate_"))
    }
}

(删除了有条件地输出下拉列表的代码,但是你明白了。)

生成的html如下:

<input class="text-box single-line" id="MyName" name="MyName" type="number" value="" />            
<span class="field-validation-valid text-danger" data-valmsg-for="MyName" data-valmsg-replace="true" id="validate_MyName" name="validate_MyName"></span>

当我点击提交时,所有这些都很好地绑定并发布到我的控制器。但是,我也想让jquery验证工作,你可能已经注意到,html.editor帮助器不输出...

data-val="true" data-val-number="The field MyName must be a number." data-val-required="The MyName field is required."
输入元素中的

...属性。这就是为什么它被不显眼的jquery验证脚本忽略了。所以我的问题是:如何以动态生成的形式从助手中获取这些属性?

2 个答案:

答案 0 :(得分:0)

我相信这会奏效。将编辑器和验证消息放在它自己的局部视图中(我在这里称之为_FormItem

@foreach (var item in Model.FormItems)
{
    @Html.RenderPartial("_FormItem", item)
}

在局部视图中_FormItem执行此操作:

@model Models.FormItem

@Html.Editor(Model.Name, Model.EditorTemplate, Model.HtmlAttributes)
@Html.ValidationMessageFor(model => model.Name, null, Model.GetHtmlAttributes("validate_"))

答案 1 :(得分:0)

我的应用程序中有类似的功能。您需要做的是创建一个子模型类,它存储“FormItems”的元素,然后将[Required]添加到每个需要的元素。

在你的主模型中你应该有这样的东西:

IList<FormItemModel> FormItems { get; set; }

然后在FormItemModel

public class FormItemModel
{
    [Required]
    public string? Name
}

然后在视图中循环遍历FormItems(我在循环中硬编码了10个元素,但是在初始化主Model类时可以创建任意数量的元素)

@for (int i = 0; i < 10; i++) {
     @Html.EditorFor(model => model.FormItems[i].Name)
}