【问题标题】:ASP.NET MVC: Create ValidationMessageFor DynamicallyASP.NET MVC:动态创建 ValidationMessageFor
【发布时间】:2017-07-18 20:32:22
【问题描述】:

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

因此我动态地创建了我的表单元素,这样

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

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

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案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");
        }
    

    【讨论】:

    • 感谢@kblau,当尝试使用 foreach(Model.Round.Matches 中的 var 项)更新单个表单中的多个记录并替换您的 @Html.ValidationMessage(arg); 时,我无法显示服务器端验证@Html.ValidationMessage($"Round.Matches[{item.ID}].HomeTeamID") 正是我所需要的。
    【解决方案2】:

    您需要内联或使用 JavaScript 显式注册验证。

    More jQuery Validate Examples(下面是一个简单的例子)

    $("#myform").validate({
      rules: {
       name: "required"
      }
    });
    

    内联前:

    <input id="age" name="age" required />
    

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多