Perform validation on hidden fields

2019-01-18 03:02发布

问题:

I have the view below:

    @Html.LabelFor(m => m.CompanyPostCode)
    @Html.TextBoxFor(m => m.CompanyPostCode)

    @Html.LabelFor(m => m.CompanyCity)
    @Html.TextBoxFor(m => m.CompanyCity)

    @Html.HiddenFor(m => m.CompanyCityID)

All attributes are marked as [Required] in my view model. Then problem is that my CompanyCityID (marked as Required) is hidden and thus no validation is done in the view. If I show this attribute in my view the validation is done.

My question: is it possible to perform a validation on a hidden field? A workaround exist?

It may seems a little strange to validate a hidden field. The reason is that this field is filled from jQuery based on special rules. If it is not filled, I know something is not valid on the view.

Thanks.

回答1:

The possible reason can be that there is ignore: ':hidden' line in jquery.validate.unobtrusive.js file.

After 1.9.0 version it is a default behaviour. You can fix that manually by adding

$.validator.setDefaults({ ignore: [] });

As you can see here

Another change should make the setup of forms with hidden elements easier, these are now ignored by default (option “ignore” has “:hidden” now as default). In theory, this could break an existing setup. In the unlikely case that it actually does, you can fix it by setting the ignore-option to “[]” (square brackets without the quotes).



回答2:

You can also just comment out this line in the jquery.validate.js file. ignore: ":hidden"



回答3:

If you don't have to use javascript, in your Controller, and in your action of the related view, you can add a model error before validating your model. Example:

 [HttpPost]
        public ActionResult Fix(YourModel mdl)
    {

    if (mdl.CompanyCityID==0)
        ModelState.AddModelError("", "Your error message!");

    if (ModelState.IsValid)
    {


       //
       //Some code
       //

        return View("YourView", yourlist);
    }

    return View(mdl);
}


回答4:

You can always put @Html.HiddenFor(m => m.CompanyCityID) inside a hidden div and change it to EditorFor().

CSS

.hidden {
    display: none;
}​

View

<div class="hidden">
        @Html.EditorFor(m => m.CompanyCityID)
</div