ASP.NET MVC: Create ValidationMessageFor Dynamically
我通过遍历数组来生成表单元素。因此,我有一个数组= [" name "," age "],然后遍历每个项目,并创建一个具有适当名称和相关数据的文本框。
因此,我动态创建了表单元素,使得
1 2 | <input class="input-validation-error text-box single-line" data-val="true" data-val-required="@arr[i] is required" id="@arr[i]" name="@arr[i]" type="text" value=""> <span class="field-validation-error" data-valmsg-for="@arr[i]" data-valmsg-replace="true"></span> |
而不是:
1 2 | @Html.EditorFor(model => model.age) @Html.ValidationMessageFor(model => model.age) |
但是,因此,没有生成客户端消息。它会在服务器端验证中捕获错误,但客户端会停止工作。
如何在保持动态创建表单的能力的同时使客户端消息起作用,以便在代码的极简代码行中可以动态提供模型的属性名称?有办法吗?
1 2 | @Html.EditorFor(model => model[@arr[i]]) @Html.ValidationMessageFor(model => model[@arr[i]]) |
我知道上面的代码行不通,只是为了强调我在解决方案中寻找的内容。
这有效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | @model Testy20161006.Controllers.MessageViewModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> IndexStackOverflow900 </head> <body> @using (Html.BeginForm()) { int i = 0; foreach (var arr in Model.myArray) { <input class="input-validation-error text-box single-line" data-val="true" data-val-required="@arr is required" id=@arr name=@arr type="text" value=""> <br /> @Html.ValidationMessage(arr); i++; } <input type="submit" value="submit" /> } </body> </html> |
控制器/型号:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class MessageViewModel { public List<string> myArray = new List<string>(); [Required] public string name { get; set; } [Required] public string age { get; set; } } public class HomeController : Controller { [HttpPost] public ActionResult IndexStackOverflow900(MessageViewModel mvm) { if (ModelState.IsValid) { } else { //you can narrow it down to which field caused the error by inspecting ModelState //List<ModelErrorCollection> errors = controller.ModelState.Select(x => x.Value.Errors) // .Where(y => y.Count > 0) // .ToList(); ModelState.AddModelError("name","name is required"); ModelState.AddModelError("age","age is required"); } FactorCode(mvm); return View(mvm); } public ActionResult IndexStackOverflow900() { MessageViewModel mvm = new MessageViewModel(); FactorCode(mvm); return View(mvm); } public void FactorCode(MessageViewModel mvm) { mvm.myArray.Add("name"); mvm.myArray.Add("age"); } |
您需要内联或使用JavaScript显式注册验证。
更多jQuery验证示例(下面是一个简短示例)
1 2 3 4 5 | $("#myform").validate({ rules: { name:"required" } }); |
内联ex:
1 | <input id="age" name="age" required /> |