我有一个包含登录和注册表单的视图。
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个问题,如果你们不介意,你能帮助我吗?
当我将模型(只有一项元组)从控制器传递给View时,我必须将其更改为Tuple&lt;&gt; type和pass 1值为null。这种方式是否正确?它对我有用但我担心我的方式不正确。
然后,当模型无效时(例如:值输入到Login表单中无效),错误消息将绑定到@ Html.ValidationSummary(false)。但它显示在2个位置(注册和登录表单)。如何解决这个问题? https://gyazo.com/e9146059a6a098ee787565222d8dc744
感谢您的帮助
答案 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();
}
}
这将在注册视图中呈现登录视图,您也可以通过其他方式执行此操作。虽然我个人只是提供一个指向用户的链接,将其重定向到登录页面而不是使用渲染。