C# MVC客户端验证摘要在模型无效时不显示

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;

我正在使用名为MVC万无一失验证的MVC验证nuget包

如果另一个模型属性为空,我在模型上使用它将required设置为true。验证部分可以工作,因为当Id字段和Location字段留空时,ModelState被正确设置为invalid。在检查ModelState数组上的错误时,我可以看到它正在工作

我的问题是客户端验证摘要不显示。这是我如何安排的。有人能发现我的问题吗

    [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>