【问题标题】:How to show validation message in mvc4 razor如何在 mvc4 razor 中显示验证消息
【发布时间】:2012-10-26 05:56:43
【问题描述】:

我是 MVC Razor 的新手,我想在文本框上实现验证消息。这里我动态地创建了一些文本框,如下所示:

查看代码:

foreach (var items in (IEnumerable<System.Data.DataRow>)Model.UsersOfList)
{

  @Html.TextBoxFor(m => m.LoginNameOfLoginInfoTab, new { @class = "textBox_LoginInfoAndPermission", @value = (Model.LoginNameOfLoginInfoTab = items["UserName"].ToString()), @id = ("txtUserLoginName" + Model.UsernameOfLoginInfoTab.Trim()) })

  @Html.ValidationMessageFor(m => m.LoginNameOfLoginInfoTab, null, new { @class = "ErrorMessage" })

  @Html.TextBoxFor(m => m.UsernameOfLoginInfoTab, new { @class = "textBox_LoginInfoAndPermission", @value = (Model.UsernameOfLoginInfoTab = items["FirstName"].ToString()), @id = ("txtUserName" + Model.UsernameOfLoginInfoTab.Trim()) })

  @Html.ValidationMessageFor(m => m.UsernameOfLoginInfoTab, null, new { @class = "ErrorMessage" })


}

在模块中,我编写了如下验证代码:

[Required (ErrorMessage="*")]
    public string UsernameOfLoginInfoTab
    {
        get;
        set;
    }


   [Required(ErrorMessage = "*")]
    public string LoginNameOfLoginInfoTab
    {
        get;
        set;
    }

现在,当所有文本框都已创建并且为第一次循环迭代文本框显示一条验证消息时,它也会自动显示在另一个文本框前面,该文本框也是在第二次循环迭代中创建的。

请告诉我出了什么问题。

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-4 validation


    【解决方案1】:

    问题是因为您在 TextBoxForValidationMessageFor 中使用的表达式(MVC 使用该表达式为字段创建字符串名称并从 ModelState 查找验证消息)始终相同循环的迭代。

    你这里的方法似乎有点缺陷,所以我的回答更全面。

    1) 制作在结构上代表您尝试显示的信息的视图模型。

    修复您的视图模型:

    public class UserInfoViewModel
    {
        [Required (ErrorMessage="*")]
        public string UserName { get; set; }
    
    
       [Required(ErrorMessage = "*")]
        public string LoginName { get; set; }
    }
    
    // I don't know if you actually need this or not, but your existing model may contain additional properties relevant to the view that I don't know about, so I'll keep it.
    public class ListOfUsersViewModel
    {
        public IList<UserInfoViewModel> UsersOfList { get; set; }
    }
    

    修正你的行为(我在这里编造这个是为了说明一点):

    public ActionResult ListOfUsers()
    {
         var users = GetUserDataRows(); // gets your collection of DataRows
         var model = new ListOfUsersViewModel
                         {
                             UsersOfList = users.Select(row = new UserViewModel { UserName = row["FirstName"], LoginName = row["UserName"] }).ToList()
                         };
    
         return View(model);                  
    }
    

    2) 现在您可以遍历视图中的用户并使用验证消息创建适当的字段。

    让我们将此视图称为ListOfUsers.cshtml。在视图中包含您需要的任何其他内容,但请改用 for 循环。

    @using(Html.BeginForm("ListOfUsers"))
    {
        <ul>
        @for (var i = 0; i < Model.UsersOfList.Count; i++)
        {
           <li>
           @Html.TextBoxFor(m.UsersOfList[i].LoginName, new {@class="textbox_LoginInfoAndPermission"})
           @Html.ValidationMessageFor(m => m.UsersOfList[i].LoginName)
    
           @Html.TextBoxFor(m.UsersOfList[i].UserName, new {@class="textbox_LoginInfoAndPermission"})
           @Html.ValidationMessageFor(m => m.UsersOfList[i].UserName)
           </li>
        }
        </ul>
       <button type="submit">Submit changes</button>
    }
    

    这将为每个项目生成这样的 HTML(名称中的0 和 id 将是用户在集合中的索引):

    <li>
    <input type="text" id="UsersOfList_0_LoginName" name="UsersOfList[0].LoginName" value="..." />
    <span class="field-validation-valid" data-valmsg-for="UsersOfList_0_LoginName" ... ></span>
    
    <input type="text" id="UsersOfList_0_UserName" name="UsersOfList[0].UserName" value="..." />
    <span class="field-validation-valid" data-valmsg-for="UsersOfList_0_UserName" ... ></span>
    </li>
    

    3) 创建一个操作来接收提交的更改。此操作将自动将提交的值绑定到 model 参数,并为您进行验证。您需要做的就是检查ModelState.IsValid

    [HttpPost, ActionName("ListOfUsers")]
    public ActionResult ListOfUsersPost(ListOfUsersViewModel model)
    {
        // at this point, model will be instantiated, complete with UsersOfList with values submitted by the user
    
        if (ModelState.IsValid) // check to see if any users are missing required fields. if not...
        {
             // save the submitted changes, then redirect to a success page or whatever, like I do below
            return RedirectToAction("UsersUpdated");
        }
    
        // if ModelState.IsValid is false, a required field or other validation failed. Just return the model and reuse the ListOfUsers view. Doing this will keep the values the user submitted, but also include the validation error messages so they can correct their errors and try submitting again
        return View("ListOfUsers", model);
    
    }
    

    【讨论】:

    • 您可以在视图中使用 foreach 循环而不是 for 循环。这将消除每次访问用户时都需要索引(即,您将拥有 user.UserName 而不是 m.UsersOfList[i].UserName)。
    • @rouan 你需要索引器,以便 MVC TextBoxForValidationMessageFor 帮助器将生成正确的 HTML 元素 ID/名称用于模型绑定和模型状态的键(分别)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多