ASP.NET MVC:循环生成的同模型属性输入框仅首个验证生效问题
问题:循环生成数组属性输入框时仅第一个验证生效
问题场景
模型中定义数组属性并标记[Required]:
public class MembershipModel { [Required] [Display(Name = "First Name")] public string[] Fname { get; set; } }
视图通过for循环生成两个绑定该数组的输入框:
@model MainModel @using (Html.BeginForm("CreateMember", "Membership", FormMethod.Post, new { role = "form", id = "myForm", @class = "form-horizontal", enctype = "multipart/form-data" })) { @for (var i = 1; i <= 2; i++) { <label>First Name</label> <i class="fa fa-asterisk req-ico"></i> @Html.TextBoxFor(m => m.MembershipModel.Fname, new { @class = "memb form-control"}) @Html.ValidationMessageFor(m => m.MembershipModel.Fname, "", new { @class = "text-danger" }) } <button type="button" class="btn btn-primary btn-modal" onclick="$('#myForm').submit()"><strong>Continue</strong></button> }
仅第一个输入框的Required验证生效,后续输入框无验证提示。
原因分析
- 直接绑定
m.MembershipModel.Fname时,所有生成的输入框name属性均为MembershipModel.Fname,客户端验证框架只会为第一个同名元素绑定验证逻辑。 - 无索引的命名方式不符合ASP.NET MVC数组模型绑定约定,后端也无法正确接收多个输入值。
解决方案
1. 提前初始化数组
在控制器Action中,为MembershipModel.Fname初始化对应长度的数组,确保视图可遍历索引:
public ActionResult CreateMember() { var model = new MainModel { MembershipModel = new MembershipModel { Fname = new string[2] // 匹配视图要生成的输入框数量 } }; return View(model); }
2. 修改视图循环逻辑
遍历数组索引,通过索引绑定数组元素,生成带索引的name属性:
@model MainModel @using (Html.BeginForm("CreateMember", "Membership", FormMethod.Post, new { role = "form", id = "myForm", @class = "form-horizontal", enctype = "multipart/form-data" })) { @for (var i = 0; i < Model.MembershipModel.Fname.Length; i++) { <label>First Name</label> <i class="fa fa-asterisk req-ico"></i> @Html.TextBoxFor(m => m.MembershipModel.Fname[i], new { @class = "memb form-control"}) @Html.ValidationMessageFor(m => m.MembershipModel.Fname[i], "", new { @class = "text-danger" }) } <button type="button" class="btn btn-primary btn-modal" onclick="$('#myForm').submit()"><strong>Continue</strong></button> }
说明
修改后,每个输入框的name属性会变为MembershipModel.Fname[0]、MembershipModel.Fname[1],既满足客户端验证框架的元素识别规则(每个元素有独立的验证逻辑),也符合ASP.NET MVC数组模型绑定要求,后端能正确接收所有输入值,同时每个输入框都会触发[Required]验证。
内容的提问来源于stack exchange,提问作者Yas Smitch
相关产品推荐
相关产品推荐

