我通过循环遍历数组来生成表单元素。所以我有一个数组= ["名称","年龄"]我循环每个项目并创建一个包含相应名称和相关数据的文本框。
因此我动态创建表单元素
<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>
而不是:
@Html.EditorFor(model => model.age)
@Html.ValidationMessageFor(model => model.age)
但是,因此,不会生成客户端消息。它会捕获服务器端验证中的错误,但客户端停止工作。
如何在保持动态创建表单的能力的同时使客户端消息工作,这样在代码的引人注目的行中,可以动态地提供模型的属性名称?有办法吗?
@Html.EditorFor(model => model[@arr[i]])
@Html.ValidationMessageFor(model => model[@arr[i]])
我知道上面的代码不起作用,但它只是为了强调我在解决方案中寻找的东西。
答案 0 :(得分:1)
您需要内联或使用JavaScript明确注册验证。
More jQuery Validate Examples(下面是一个简短的例子)
$("#myform").validate({
rules: {
name: "required"
}
});
内联前:
<input id="age" name="age" required />
答案 1 :(得分:1)
这有效:
@model Testy20161006.Controllers.MessageViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>IndexStackOverflow900</title>
</head>
<body>
<div>
@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" />
}
</div>
</body>
</html>
控制器/型号:
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");
}