我有一个像这样的部分视图(简化):
@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>
我不知道为什么。
答案 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>
另外,你能展示部分视图的代码吗?如果您正在引用模型中子类内部的值,则验证有时可能会有点不稳定。
最后,这听起来很愚蠢但是由于您没有发布登录模型的代码,请确保使用正确的数据注释来显示您希望验证显示的值。