annotation de données « nécessaire » ne fonctionne pas sur un groupe de cases à cocher
-
26-10-2019 - |
Question
Mon problème est un peu similaire à ce problème Validation personnalisée sur le groupe de cases à cocher
I ai un groupe de cases à cocher dans la vue (New.cshtml) qui sont rendue en utilisant « ParentObjet » en tant que modèle de vue
ParentObject.cs: -
public class ParentObject
{
[Required]
public IEnumerable<RegionObject> Regions { get; set; }
}
New.cshtml: -
@model ParentObject
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()){
@Html.LabelFor(model => model.Regions)
@Html.EditorFor(model => model.Regions)
@Html.ValidationMessageFor(model => model.Regions)
<input type="submit" title="Create new parent object" class="button btn67" value="Create" />
}
Le modèle de l'éditeur pour les régions est dans \ Views Shared \ EditorTemplates \ RegionObject.cshtml qui est comme ceci
@model RegionObject
<p>
@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Code)
@Html.DisplayFor(m => m.Name)
</p>
Le modèle de vue RegionObject est:
public class RegionObject
{
public Guid Code { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
}
Pourquoi l'annotation de données « obligatoires » sur les « régions » ne fonctionne pas? Je veux vous assurer au moins 1 case à cocher est sélectionnée contre les régions. J'aurais pensé « nécessaire » serait faire le travail, mais apparemment pas. Est-ce que je dois écrire un validateur personnalisé pour faire ce travail?
Merci.
La solution
L'attribut requis ne peut pas fonctionner sur les collections que vous pourriez souhaiter. Aussi comment voulez-vous vous attendez de savoir que au moins une case à cocher doivent être sélectionnées à partir de cette classe RegionObject
personnalisée? Comment pensez-vous à relier la propriété IsChecked
dans cette collection?
Dois-je besoin d'écrire un validateur personnalisé pour faire ce travail?
Oui, vous avez besoin d'un attribut de validation personnalisé pour y parvenir. Par exemple:
public class AtLeastOneRegionMustBeCheckedAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var instance = value as IEnumerable<RegionObject>;
if (instance != null)
{
return instance.Where(x => x.IsChecked).Count() > 0;
}
return base.IsValid(value);
}
}
et
public class ParentObject
{
[AtLeastOneRegionMustBeChecked(ErrorMessage = "Please select at least one region")]
public IEnumerable<RegionObject> Regions { get; set; }
}