ASP.NET MVC:动态创建ValidationMessageFor

时间:2017-07-18 20:32:23

标签: c# asp.net-mvc razor

我通过循环遍历数组来生成表单元素。所以我有一个数组= ["名称","年龄"]我循环每个项目并创建一个包含相应名称和相关数据的文本框。

因此我动态创建表单元素

 <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) 

但是,因此,不会生成客户端消息。它会捕获服务器端验证中的错误,但客户端停止工作。

enter image description here

如何在保持动态创建表单的能力的同时使客户端消息工作,这样在代码的引人注目的行中,可以动态地提供模型的属性名称?有办法吗?

@Html.EditorFor(model => model[@arr[i]])
@Html.ValidationMessageFor(model => model[@arr[i]]) 

我知道上面的代码不起作用,但它只是为了强调我在解决方案中寻找的东西。

2 个答案:

答案 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");
    }