【发布时间】:2013-08-03 21:15:57
【问题描述】:
我一直在尝试从 webforms 背景学习 asp.net MVC,但我相信我没有很好地理解动作、控制器及其与部分的关系......
我有一个 _Layout.cshtml 文件,其中包含一个 _LoginPartial.cshtml (它不是 Visual Studio 的默认代码,只是同名) em> 和一个 Home/Index.cshtml 文件,其中也包含相同的部分 (_LoginPartial),这是部分的代码:
@model LoginModel
@if (Request.IsAuthenticated) {
@*<welcome text here>*@
} else {
if ( Model.Layout == LoginLayout.Compact ) {
@*<simple layout here>*@
} else {
<form method="post" action="~/Profile/Login">
@Html.AntiForgeryToken()
@Html.LabelFor(m => m.Email, "Email Field")
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
@Html.LabelFor(m => m.Password, "Password Field")
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
@Html.ValidationSummary()
</form>
}
}
所以 _Layout.cshtml 文件包含带有以下代码的 _LoginPartial.cshtml(_Layout.cshtml 内没有表单标签):
@Html.Partial("_LoginPartial", new LoginModel())
并且 Home/Index.cshtml 包含相同的部分,并带有以下代码(除了 _LoginPartial 中的一个之外没有表单标记):
@Html.Partial("_LoginPartial", new LoginModel() {
Layout = LoginLayout.Full
})
所以我决定创建一个新的(PostController)来尝试,而不是使用默认的“AccountController”,上面的部分将其数据成功发布到ProfileController,但是当数据不正确时ValidationMessage 始终为空,这是我的控制器的代码:
public class ProfileController : BaseController
{
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel form)
{
if (ModelState.IsValid)
{
//code to validate the user here
if (userIsValid)
{
FormsAuthentication.SetAuthCookie(form.Email, false);
return RedirectToAction("Index");
}
}
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return RedirectToAction("Index", "Home");
}
}
如您所见,部分是通过 Home/Index.cshtml 访问的,但其控制器位于 Profile/Login 中,因此当它重定向回 Home/Index 页面时,不会显示验证消息...
我的问题是:我做对了吗?如何从我的模型中显示 ValidationMessage?如果我没有做正确的事情,这些动作和控制器应该如何构建以符合 MVC 模型?
为了完整起见,这是我的 LoginModel 类:
public enum LoginLayout {
Compact,
Full
}
public class LoginModel
{
public LoginLayout Layout { get; set; }
[Required(ErrorMessage = "Please enter your e-mail")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required(ErrorMessage = "Please enter your password")]
[DataType(DataType.Password)]
public string Password { get; set; }
}
【问题讨论】:
-
摘要中 ASP.NET MVC - How to maintain ModelState from a different controller? 的可能重复项 - 在 MVC 中的任何
Redirects(我知道)期间都不会维护 ModelState。 -
确实我在提到的帖子中找到了答案(与作者投票作为答案相同),非常感谢,很抱歉复制它
标签: c# asp.net-mvc validation asp.net-mvc-4 razor