如何使模型验证来自不同控制器的部分视图?

时间:2013-08-02 14:37:41

标签: c# asp.net-mvc validation asp.net-mvc-4 razor

我一直在努力学习来自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; }
}

1 个答案:

答案 0 :(得分:1)

你做的是正确的事情,但就像那样,你有Required注释的验证信息吗?或者只是因为您添加到模型状态的那个缺失了? 如果它缺少所有这些

@Html.Partial("_LoginPartial", new LoginModel())

可能是问题,您是否尝试@Html.EditorFor(编辑:忘记提及您应该将部分视图 _LoginPartial 移动到根编辑器模板文件夹中)?您也应该使用它作为密码和电子邮件btw。

在任何情况下,添加到模型状态的错误都没有MVC显示的位置,您需要@Html.ValidationSummary(true)行的内容我想记得读一些关于仅显示特定验证错误的内容,让我看看我是否可以为你挖掘

编辑:刚发现,使用@using(@Html.BeginForm(而不是手动放置这样的形式,它更容易和更Razor友好(你将能够很容易ajaxify以后很容易,我建议像这样的记录表格)

编辑2:haHA以下是我所说的,link,这里的答案将允许您显示特定的模型状态错误(如果存在),但是您需要在键入时给它一个键您将其添加到模型状态