关于c#:ASP.NET MVC:动态创建ValidationMessageFor

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)

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

enter

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