我一直在努力学习来自webforms背景的asp.net MVC,我相信我并没有很好地理解动作,控制器以及它们与局部的关系......
我有一个 _Layout.cshtml 文件,其中包含 _LoginPartial.cshtml (它不是Visual Studio中的默认代码,只是同名)和一个 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
})
所以不是使用默认的“AccountController”我决定创建一个新的(PostController)来尝试,上面的部分将它的数据成功发布到 ProfileController ,但是当数据不正确时< strong> 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; }
}
答案 0 :(得分:1)
你做的是正确的事情,但就像那样,你有Required
注释的验证信息吗?或者只是因为您添加到模型状态的那个缺失了?
如果它缺少所有这些
@Html.Partial("_LoginPartial", new LoginModel())
可能是问题,您是否尝试@Html.EditorFor
(编辑:忘记提及您应该将部分视图 _LoginPartial 移动到根编辑器模板文件夹中)?您也应该使用它作为密码和电子邮件btw。
在任何情况下,添加到模型状态的错误都没有MVC显示的位置,您需要@Html.ValidationSummary(true)
行的内容我想记得读一些关于仅显示特定验证错误的内容,让我看看我是否可以为你挖掘
编辑:刚发现,使用@using(@Html.BeginForm(
而不是手动放置这样的形式,它更容易和更Razor友好(你将能够很容易ajaxify以后很容易,我建议像这样的记录表格)
编辑2:haHA以下是我所说的,link,这里的答案将允许您显示特定的模型状态错误(如果存在),但是您需要在键入时给它一个键您将其添加到模型状态