【问题标题】:MVC Client Side Validation Summary not showing when Model is Invalid模型无效时未显示 MVC 客户端验证摘要
【发布时间】:2017-08-14 13:47:23
【问题描述】:

我正在使用名为 MVC Foolproof Validation 的 MVC Validation nuget 包。

如果另一个模型属性为空,我将在我的模型上使用它来将 required 设置为 true。验证部分有效,因为当 Id 字段和 Location 字段留空时,ModelState 正确设置为无效。检查 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>

在我的控制器操作中,我正在检查模型状态。我需要调用 ModelState.AddModelError(..)。我已经尝试过了,但也许我需要一种方法来调用它。

    [HttpPost]
    public ActionResult Search(SearchCriteria searchCriteria)
    {
        var searchViewModel = new SearchViewModel
        {
            SearchCriteria = searchCriteria
        };

        if (ModelState.IsValid)
        {
            ...
        }
        //ModelState.AddModelError("LocationId", "test");
        return View(searchViewModel);
    }

【问题讨论】:

  • @Html.ValidationSummary(true, ..) 表示它排除了属性级别的错误。但是您已经有了@Html.ValidationMessageFor(model =&gt; model.SearchCriteria.LocationId, ...),如果Idnull 并且您没有为LocationId 提供值,它将在该位置显示错误消息。如果您已正确设置,则会显示错误消息,并且如果表单无效,您甚至无法提交表单,因此您点击控制器方法的事实表明其他问题
  • 当你视图中的模型看起来不是@model SearchCriteria时,方法中的参数是SearchCriteria这一事实表明更多的问题

标签: c# asp.net-mvc asp.net-mvc-validation foolproof-validation


【解决方案1】:

将 ValidationSummary 帮助行中的布尔参数(excludePropertyErrors)更改为false

@Html.ValidationSummary(false, "", new {@class = "text-danger"})

https://msdn.microsoft.com/de-de/library/ee839464(v=vs.118).aspx

【讨论】:

  • 那没有任何区别。我应该声明,除了没有显示验证摘要之外,控件本身下方的验证错误消息也没有显示......
  • 这可能与您的视图模型类的使用不一致有关。您在视图中使用model.SearchCriteria.LocationId,并且您的控制器获得SearchCriteria 参数。这似乎很奇怪。您可以尝试在视图和控制器中仅使用 SearchCriteria 吗?
  • 我不关注。看起来很标准,视图有一个模型,上面有一些属性,每个属性都有自己的数据注释上指定的验证标准,..我一定错过了你在说什么?
  • 我刚刚尝试了一个带有您描述的案例的示例项目,它运行良好。但是您没有发布整个课程并查看..也许那里还有另一个我们没有看到的问题...
  • 嗨,菲利普,感谢您的更新。是的,您是正确的,默认行为会起作用,但我在 ajax 请求中提出请求并阻止回发(难怪!)。我要更新了
【解决方案2】:

在我的情况下,我解决了从“ModelOnly”更改为“All”的问题:

发件人:

<div asp-validation-summary="ModelOnly" class="text-danger"></div>

收件人:

<div asp-validation-summary="All" class="text-danger"></div>

【讨论】:

  • ValidationSummary.All 显示属性和模型级别的验证。 ValidationSummary.ModelOnly 仅显示适用于模型级别的验证消息。 Source
【解决方案3】:

我的问题是我的行动是通过 ajax 完成的。我真的应该指出,在这里提供帮助的人会立即诊断出问题。当模型状态无效时,我正在返回一个新视图(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 });
    }

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多