模型无效时,MVC客户端验证摘要未显示

时间:2017-08-14 13:47:24

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

我正在使用名为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);
    }

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

就我而言,我解决了将其从“仅模型”更改为“全部”的问题:

发件人:

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

收件人:

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