我从数据库生成一个表单,我想使用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验证脚本忽略了。所以我的问题是:如何以动态生成的形式从助手中获取这些属性?
答案 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)
}