2

對於我網站的登錄頁面,我想列出我網站的最新消息,並顯示幾個字段以讓用戶登錄。所以我想我應該創建一個登錄視圖模型 - 我稱之爲LoginVMASP.NET MVC:我如何驗證包裝在ViewModel中的模型?

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做一些根本性的錯誤?如果newsItems只是爲了顯示,並不需要驗證或者

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

回答

2

在你的ViewModel嘗試這樣做。

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

您還需要在視圖中使用EditFor和LabelFor助手。

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

這似乎是工作,我會盡快接受的答案,所以讓我。但是這裏真的發生了什麼?這是一個黑客,使ASP.NET MVC驗證'登錄'實例? – 2010-06-15 14:38:15

+0

@Deniz Dogan - 基本上,如果ModelBinder無法創建新的Login(),驗證將失敗。沒有黑客。 – jfar 2010-06-15 14:44:28

+0

不,這不是黑客,實際上這是模型驗證如何在MVC的V2中起作用。看看這篇博文http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+BradWilson+ %28Brad +威爾遜%29 – vintem 2010-06-15 16:06:00

1

,那麼你可以通過只登錄模式,你的操作方法:

0
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> 
相關問題