使用Tuple传递多个模型

时间:2016-08-08 18:26:50

标签: c# asp.net-mvc

我有一个包含登录和注册表单的视图。

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. 当我将模型(只有一项元组)从控制器传递给View时,我必须将其更改为Tuple&lt;&gt; type和pass 1值为null。这种方式是否正确?它对我有用但我担心我的方式不正确。

  2. 然后,当模型无效时(例如:值输入到Login表单中无效),错误消息将绑定到@ Html.ValidationSummary(false)。但它显示在2个位置(注册和登录表单)。如何解决这个问题? https://gyazo.com/e9146059a6a098ee787565222d8dc744

  3. 感谢您的帮助

1 个答案:

答案 0 :(得分:3)

登录和注册是两种不同的模型。你可以使用html助手在asp.net中使用Tuples。使用元组只会让事情变得混乱。

你可能想要的是这样的:

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();
    }
}

这将在注册视图中呈现登录视图,您也可以通过其他方式执行此操作。虽然我个人只是提供一个指向用户的链接,将其重定向到登录页面而不是使用渲染。