2016-08-02 6 views
0

私はMVCを学ぶ途中ですが、これはまったく別の考え方です。単純なログインフォームを例として取り上げましたが、私を混乱させる1つの問題は、アクションにボタンを送信し、オブジェクトを渡します。私に例を挙げましょう。MVCでコントローラにオブジェクトを渡す

はここでここで見るここ

@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 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; 
     } 
    } 

ですpublic ActionResult Login()であり、第2のオーバーロードはpublic ActionResult Login(ExternalUser user)ではありません。私はなぜそれが正しい方法に当てられていないのか分からないことを教えてくれますか?

ありがとうございました

+4

あなたはそれについて非常に確かですか?あなたのコードは正常に動作するはずです。 HttpPostログインメソッドにデータを送信する必要があります。あなたはそれが最初の行動に行くことをどのように知っていますか?アクションメソッドにブレークポイントを設定して確認しましたか? – Shyju

+0

あなたのフォームは何とか​​ 'POST'リクエストの代わりに' GET'リクエストを発行していますか?実際の 'form'タグは何ですか?ブラウザのデバッグツールでリクエストを監視するとき、どのタイプのリクエストですか?それはあなたが期待するデータを含んでいますか?あなたはどのように具体的にあなたが見ている行動を確認していますか? – David

+0

@ shyjuそれはまさに私がやったことです。ブレークポイントが間違った方法になっていることを確認しました – Coesy

答えて

0

は、私はそれゆえ、それは今を発射ページに配置するには、2つの<forms>、共有フォルダ内の1つを取り外した後引き起こし、/Shared/SiteLayout.cshtml内の余分な<form>タグに入れていたことに気づきました方法!私はこれが将来誰かを助けることを願っています。

+0

これは面白いです。不思議なことに、SiteLayout.cshtmlのフォームの中にログインフォームが入っていましたか? '' '

--sitelayout.cshtml --login.cshtml の下ののように、本質的に、はい、それは問題
' '' –

+0

ました – Coesy

4

なぜ機能しないのか考えられません。しかし、ブラウザで生成されたHTMLがinspect elementオプションを使用してチェックされる度合いは少なくなります。 <form>タグのaction属性値が 'GET'に設定されている場合、またはaction属性が完全に欠落している場合は、明示的にpostとして指定してください。

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

これは、 。 –

+0

私はすでにPOSTに設定されているHTMLをチェックしました。

Coesy

関連する問題