2016-08-08 8 views
-1

ログインと登録フォームを含むビューがあります。タプルを使用して複数のモデルを渡す

LoginAndRegister.cshtmlファイル:

@model Tuple<Models.LoginViewModel, Models.RegisterViewModel> 

    @using (Html.BeginForm("Login", "Account", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(false) 
     // Form Login here 

    } 
    @using (Html.BeginForm("Register", "Account", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(false) 

     // Form Register here 

    } 

AccountControllerファイル:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register([Bind(Prefix = "Item2")] RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // enter code here  
     } 

     // If we got this far, something failed, redisplay form 
     var tupleModel = new Tuple<LoginViewModel, RegisterViewModel>(null, model); 
     return View("LoginAndRegister", tupleModel); 
     } 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login([Bind(Prefix = "Item1")] LoginViewModel model, string returnUrl) 
    { 
     var tupleModel = new Tuple<LoginViewModel, RegisterViewModel>(model, null); 

     if (!ModelState.IsValid) 
     { 
       return View("LoginAndRegister", tupleModel); 
     } 

    } 

あなたは私を助けることができるあなたたちは気にしないならば、私は、2質問がありますか?

  1. 私が見るために、コントローラからモデル(タプルのただ一つの項目)を通過するとき、iは<をタプルに変更する必要が> 1つの値がnullで入力して渡します。この方法は正しいのですか?それは私のために働いていますが、自分の道が間違っていることを恐れています。

  2. モデルが無効な場合(例:ログインフォームへの値の入力が無効)、エラーメッセージは@ Html.ValidationSummary(false)にバインドされます。しかし、それは2つの場所(登録とログインフォーム)で示している。この問題を解決するには? https://gyazo.com/e9146059a6a098ee787565222d8dc744

+3

あなたはモデルのバインダーを通して何かを靴ひねりにしようとしているようです。なぜあなたは必要なすべての情報を含んでいるモデルを作り、それを渡すのはなぜですか? –

+1

はい、すべてのプロパティを含む大きなViewModelを作成するか、LoginViewModelとRegisterViewModelを含む新しいViewModelを作成します。 – niico

答えて

2

ログインを支援するようなものをありがとうと登録は、2つの異なるモデルです。あなたはhtmlヘルパーでasp.netのタプルを使って回ることができます。タプルを使うだけで、物事が乱雑になります。

Register.cshtmlファイル:

@model Models.RegisterViewModel 

@using (Html.BeginForm("Register", "Account", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(false) 

    // Form Register here 

} 
<div>Or if you already have an account then login:</div> 
@Html.RenderAction("Login") 

コントローラー:

public ActionResult Login() 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     return PartialView(); 
    } 
} 

このレジスタビューでログインビューをレンダリングします、あなたは

は何あなたはおそらくしたいことは、このようなものですこれを逆にすることもできます。私は個人的には、レンダリングを使用するのではなく、ログインページにリダイレクトするためのユーザーへのリンクを提供するだけですが。

+0

あなたの提案をお試しください。親切なお手伝い –

関連する問題