C# MVC客户端验证摘要在模型无效时不显示
我正在使用名为MVC万无一失验证的MVC验证nuget包 如果另一个模型属性为空,我在模型上使用它将required设置为true。验证部分可以工作,因为当Id字段和Location字段留空时,ModelState被正确设置为invalid。在检查ModelState数组上的错误时,我可以看到它正在工作 我的问题是客户端验证摘要不显示。这是我如何安排的。有人能发现我的问题吗C# MVC客户端验证摘要在模型无效时不显示,c#,asp.net-mvc,asp.net-mvc-validation,foolproof-validation,C#,Asp.net Mvc,Asp.net Mvc Validation,Foolproof Validation,我正在使用名为MVC万无一失验证的MVC验证nuget包 如果另一个模型属性为空,我在模型上使用它将required设置为true。验证部分可以工作,因为当Id字段和Location字段留空时,ModelState被正确设置为invalid。在检查ModelState数组上的错误时,我可以看到它正在工作 我的问题是客户端验证摘要不显示。这是我如何安排的。有人能发现我的问题吗 [DisplayName("Image Id")] public string Id{ get; set;
[DisplayName("Image Id")]
public string Id{ get; set; }
[DisplayName("Location Id")]
[RequiredIfEmpty("Id", ErrorMessage = "You must..etc"]
public string LocationId{ get; set; }
在我看来,我正在设置验证摘要和输入,如下所示
<div class="form-horizontal">
<hr/>
@Html.ValidationSummary(true, "", new {@class = "text-danger"})
<div class="form-group">
@Html.LabelFor(model => model.SearchCriteria.Id, htmlAttributes: new {@class = "control-label col-md-2"})
<div class="col-md-10">
@Html.EditorFor(model => model.SearchCriteria.Id, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => model.SearchCriteria.Id, "", new {@class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.SearchCriteria.LocationId, htmlAttributes: new {@class = "control-label col-md-2"})
<div class="col-md-10">
@Html.EditorFor(model => model.SearchCriteria.LocationId, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => model.SearchCriteria.LocationId,"", new {@class = "text-danger"})
</div>
</div>
将ValidationSummary帮助程序行中的布尔参数(excludePropertyErrors)更改为
false
:
@Html.ValidationSummary(false, "", new {@class = "text-danger"})
请参见我的问题是,我对我的操作的调用是通过ajax完成的。我真的应该说明,在这里帮忙的人会立即诊断出这个问题。当modelstate无效时,我返回一个新视图(searchViewModel),但我必须更新该视图以返回json中的错误
[HttpPost]
public ActionResult Search(SearchCriteria searchCriteria)
{
if (ModelState.IsValid)
{
var searchResults = _searchProvider.GetData(searchCriteria);
return Json(new
{
searchResults
}, JsonRequestBehavior.AllowGet);
}
string errorMessages = string.Join(" <br /> ", this.ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage));
return this.Json(new { HasError = true, ErrorMessages = errorMessages });
}
[HttpPost]
公共行动结果搜索(SearchCriteria SearchCriteria)
{
if(ModelState.IsValid)
{
var searchResults=\u searchProvider.GetData(searchCriteria);
返回Json(新的
{
搜索结果
},JsonRequestBehavior.AllowGet);
}
string errorMessages=string.Join(“
”,this.ModelState.Values
.SelectMany(v=>v.Errors)
.选择(e=>e.ErrorMessage));
返回this.Json(新的{HasError=true,ErrorMessages=ErrorMessages});
}
在我的例子中,我解决了从“ModelOnly”变为“All”的问题:
发件人:
致:
这没什么区别。我应该声明,除了验证摘要没有显示外,控件下面的验证错误消息也没有显示……这可能与视图模型类的使用不一致有关。在视图中使用model.SearchCriteria.LocationId
,控制器将获得一个SearchCriteria
参数。这似乎很奇怪。您是否可以尝试在视图和控制器中仅使用搜索条件
?我不这样做。看起来很标准,视图有一个带有一些属性的模型,这些属性中的每一个都在数据注释上指定了自己的验证标准,…我一定是没有听到你说的话?我刚刚用你描述的案例尝试了一个示例项目,效果很好。但是你没有发布你所有的课程和观点。。也许还有另一个问题,我们没有看到…嗨,菲利普,谢谢你的更新。是的,你是对的,默认行为会起作用,但我是在ajax请求中发出请求并阻止回发的(难怪!)。我要更新@Html.ValidationSummary(true,…)
意味着它排除了属性级错误。但是您已经有了@Html.ValidationMessageFor(model=>model.SearchCriteria.LocationId,…)
,如果Id
为null
并且您没有为LocationId
提供值,那么它将在该位置显示错误消息。如果设置正确,错误消息将被显示,如果表单无效,您甚至无法提交表单,因此您点击控制器方法的事实表明存在其他问题,并且当您视图中的模型看起来不是@model SearchCriteria
时,方法中的参数是SearchCriteria
这一事实表明存在更多问题问题ValidationSummary.All
同时显示属性级和模型级验证<代码>验证摘要。仅模型仅显示应用于模型级别的验证消息。
[HttpPost]
public ActionResult Search(SearchCriteria searchCriteria)
{
if (ModelState.IsValid)
{
var searchResults = _searchProvider.GetData(searchCriteria);
return Json(new
{
searchResults
}, JsonRequestBehavior.AllowGet);
}
string errorMessages = string.Join(" <br /> ", this.ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage));
return this.Json(new { HasError = true, ErrorMessages = errorMessages });
}
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div asp-validation-summary="All" class="text-danger"></div>