【问题标题】:ASP.NET MVC: How do I validate a model wrapped in a ViewModel?ASP.NET MVC:如何验证包装在 ViewModel 中的模型?
【发布时间】:2011-03-04 00:43:56
【问题描述】:

对于我网站的登录页面,我想列出我网站的最新消息,并显示一些字段让用户登录。所以我想我应该制作一个登录视图模型 - 我称之为@987654321 @。

LoginVM 包含用于登录字段的Login 模型和用于新闻列表的List<NewsItem>

这是Login 型号:

public class Login
{

    [Required(ErrorMessage="Enter a username.")]
    [DisplayName("Username")]
    public string Username { get; set; }

    [Required(ErrorMessage="Enter a password.")]
    [DataType(DataType.Password)]
    [DisplayName("Password")]
    public string Password { get; set; }

}

这是LoginVM 视图模型:

public class LoginVM
{
    public Login login { get; set; }
    public List<NewsItem> newsItems { get; set; }
}

这就是我卡住的地方。在我的登录控制器中,我得到了一个LoginVM

[HttpPost]
public ActionResult Login(LoginVM model, FormCollection form)
{
    if (ModelState.IsValid)
    {
        // What?

在代码中,我正在检查 ModelState 是否有效,如果视图模型实际上是 Login 模型,这将正常工作,但现在它是 LoginVM,它根本没有验证属性。

如何使LoginVM“遍历”其成员以验证所有成员?我以这种方式使用ModelState 做错了什么?

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller validation asp.net-mvc-2


    【解决方案1】:

    在您的 ViewModel 中尝试这样做:

    public class LoginVM
    {
        [Required]
        public Login login { get; set; }
        public List<NewsItem> newsItems { get; set; }
    }
    

    【讨论】:

    • 这似乎行得通,我会尽快接受答案。但这里到底发生了什么?这是让 ASP.NET MVC 验证 Login 实例的技巧吗?
    • @Deniz Dogan - 基本上,如果 ModelBinder 无法创建新的 Login(),则验证失败。没有黑客。
    • 不,这不是 hack,实际上这就是模型验证在 MVC V2 中的工作方式。看看这篇博文bradwilson.typepad.com/blog/2010/01/…
    【解决方案2】:

    或者,如果 newsItems 用于显示目的,并且不需要验证,那么您可以只将 Login 模型传递给您的操作方法。

    [HttpPost]
    public ActionResult Login([Bind(Prefix = "Login")]Login model)
    {
        if (!Model.IsValid)
    }
    

    您还需要在视图中使用 EditFor 和 LabelFor 助手。

    <%= Html.TextBoxFor(m => m.Login.Username) %>
    

    【讨论】:

      【解决方案3】:
      i'd like give you a modal solution:
      
       @if (Request.IsAuthenticated)
      
                    {
                        <li class="span3">
                            <a href="Home/AboutMe" role="button" class="btn" data-toggle="modal">[@Membership.GetUser().UserName]</a>
                            </li>
                            <li>@Html.ActionLink("logoff","LogOff","Account")</li>
                       }
                    else
                    {
                         <li class="span3">
                            <a href="#myModal" id="Login" role="button" class="btn" data-toggle="modal" >Login</a>
                         </li>
                    }
      
      <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      
                  <div class="modal-dialog">
                      <div class="modal-content">
                          <div class="modal-header">
                              <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                              <h4 class="modal-title" id="myModalLabel"> Login </h4>
                          </div>
                          <div class="modal-body">
                              <form class="form-horizontal">
                                  <div class="control-group">
                                      <label class="control-label" for="inputEmail">Email</label>
                                      <div class="controls">
                                          <input type="text" id="inputEmail" placeholder="Email">
                                      </div>
                                  </div>
                                  <div class="control-group">
                                      <label class="control-label" for="inputPassword">Password</label>
                                      <div class="controls">
      
                                          <input type="password" id="inputPassword" placeholder="Password">
                                      </div>
                                  </div>
                                  <div class="control-group">
                                      <div class="controls">
                                          <label class="checkbox">
                                              <input type="checkbox">
                                              Remember me
                                          </label>
                                          <button type="submit" class="btn">Sign in</button>
                                      </div>
                                  </div>
                              </form>
                          </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-11
        • 2011-02-03
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        相关资源
        最近更新 更多