ValidationSummary在部分视图内部未显示错误

时间:2013-07-25 14:25:17

标签: validation asp.net-mvc-4 model

我有一个像这样的部分视图(简化):

@model Portal.Models.LoginModel

<div class="login-container k-block">

    <section id="login-form" class="">
        @using (Html.BeginForm(actionName, controllerName, new { ReturnUrl = ViewBag.ReturnUrl }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)

            <fieldset id="login-form-list-items">
                <ol>
                <li>
                    @Html.LabelFor(m => m.CardNumber)
                    @Html.TextBoxFor(m => m.CardNumber, new { @class="k-textbox"})
                    <div class="k-error-colored">
                        @Html.ValidationMessageFor(m => m.CardNumber)
                    </div>
                </li>
                <li>
                    @Html.LabelFor(m => m.Pin)
                    @Html.PasswordFor(m => m.Pin, new { @class="k-textbox"})
                    <div class="k-error-colored">
                        @Html.ValidationMessageFor(m => m.Pin)
                    </div>
                </li>
                <input id="login-input-submit" class="k-button" type="submit" value="Enter" />
            </fieldset>

</div>

在我的login视图中,我将此部分视图称为:

@model Portal.Models.LoginModel

@Html.Partial("_LoginFormNoRegistration", Model, new ViewDataDictionary { { "actionName", "Login" }, { "controllerName", "Account" } })

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

问题在于,当控制器中的login方法添加如下错误时:

    public ActionResult Login(LoginModel model, string returnUrl)
    {
        //...

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

验证摘要中未显示该消息...我不明白为什么......可能是什么问题?有些javascript库丢失了吗?

更新

我还发现生成为novalidate属性集的表单:

<form action="/" method="post" novalidate="novalidate">
//...
</form>

我不知道为什么。

3 个答案:

答案 0 :(得分:9)

我发现了问题。

我在RenderPartial中传递了一个新的ViewData,它覆盖了父视图的ViewData,因此模型状态丢失了,如下所述:Pass Additional ViewData to an ASP.NET MVC 4 Partial View While Propagating ModelState Errors

将主视图更改为:

@model Portal.Models.LoginModel

@{
    ViewData.Add("actionName", "Login");
    ViewData.Add("controllerName", "Account");
    Html.RenderPartial("_LoginFormNoRegistration", Model, ViewData);
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

诀窍!

另外,如果要在validationsummary中显示模型的常规错误消息,请务必使用空字符串作为键添加错误:

ModelState.AddModelError("error", "The user name or password provided is incorrect."); - 不起作用

ModelState.AddModelError("", "The user name or password provided is incorrect."); - 有效

答案 1 :(得分:4)

删除@Html.ValidationSummary()

中的真实参数

答案 2 :(得分:0)

这可能是我头脑中的一些不同的事情。首先,您可能不会包含所需的JavaScript。您可能不需要所有这些,但我几乎在所有布局视图中都包含这些。

<script src="@Url.Content("~/Scripts/jquery-1.8.3.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

另外,你能展示部分视图的代码吗?如果您正在引用模型中子类内部的值,则验证有时可能会有点不稳定。

最后,这听起来很愚蠢但是由于您没有发布登录模型的代码,请确保使用正确的数据注释来显示您希望验证显示的值。