2016-08-02 40 views
0

我正處在學習MVC的過程中,這是一種不同的思維方式,我以一個簡單的登錄表單爲例,但讓我困惑的一件事是我如何將將按鈕提交給Action並傳遞該對象。讓我舉個例子。在mvc中傳遞一個對象給控制器

這裏是示範

public class ExternalUser 
    { 

     [Display(Name = "User Name")] 
     [MaxLength(50)] 
     public string UserName { get; set; } 
     [Display(Name = "Password")] 

     public string Password { get; set; } 
     [Display(Name = "Remember Me")] 

     public bool RememberMe { get; set; } 
     public bool IsValid() 
     { 
      return true; 
     } 
    } 

這裏是查看

@model ExternalUser 
@{ 
    ViewBag.Title = "Login";  
} 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true, "Login failed. Check your login details."); 
    <div> 
     <fieldset> 
      <legend>Login</legend> 
      <div class="editor-label"> 
       @Html.LabelFor(u => u.UserName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(u => u.UserName) 
       @Html.ValidationMessageFor(u => u.UserName) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(u => u.Password) 
      </div> 
      <div class="editor-field"> 
       @Html.PasswordFor(u => u.Password) 
       @Html.ValidationMessageFor(u => u.Password) 
      </div> 
      <div class="editor-label"> 
       @Html.CheckBoxFor(u => u.RememberMe) 
       @Html.LabelFor(u => u.RememberMe) 
      </div> 
      <input type="submit" value="Log In" /> 
     </fieldset> 
    </div> 
} 

這裏是控制器

public class UserController : Controller 
    { 
     // GET: /User/ 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpGet] 
     public ActionResult Login() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Login(ExternalUser user) 
     { 
      if (ModelState.IsValid) 
      { 
       if (user.IsValid()) 
       { 
        FormsAuthentication.SetAuthCookie(user.UserName, user.RememberMe); 
        return RedirectToAction("Index", "Home"); 
       } 
       else 
       { 
        ModelState.AddModelError("", "Login data is incorrect!"); 
       } 
      } 
      return View(user); 
     } 
     public ActionResult Logout() 
     { 
      FormsAuthentication.SignOut(); 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

當我點擊登錄按鈕,它會第一超載的public ActionResult Login()而不是第二次超載public ActionResult Login(ExternalUser user)這是我會ex你能告訴我我錯過了爲什麼它沒有達到正確的方法嗎?

謝謝

+4

你很確定嗎?你的代碼應該工作正常。它應該提交數據到你的HttpPost登錄方法。你怎麼知道這是第一次行動?你是否在你的行動方法中加入了一個斷點並驗證它? – Shyju

+0

您的表單以某種方式發出GET請求而不是POST請求?什麼是實際的'form'標籤?當你在瀏覽器的調試工具中監視請求時,它是什麼類型的請求?它是否包含您期望的數據?你具體如何確認你所看到的行爲? – David

+0

@shyju那正是我所做的。斷點確認它將採用錯誤的方法 – Coesy

回答

0

我意識到,我已經把在/Shared/SiteLayout.cshtml額外<form>標籤,因此使兩件<forms>放置在頁面上,在共享文件夾中刪除一前一後,現在觸發正確的方法!我希望這可以幫助未來的人。

+0

這很有趣。只是好奇,在SiteLayout.cshtml中的表單中包含登錄表單呢?像下面 '''

--sitelayout.cshtml --login.cshtml
''' –

+0

基本上肯定的,這是問題 – Coesy

4

想不通它不起作用的原因。但是,使用inspect element選項檢查在瀏覽器中生成的HTML也無濟於事。如果<form>標記的action屬性值設置爲'GET'或者action屬性完全丟失,請嘗試明確指定它爲post。

Html.BeginForm("Login", "User", FormMethod.Post) 
+0

這就是我要寫的。 –

+0

我檢查了它已經設置爲POST的HTML

Coesy

相關問題