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.

Était-ce utile?

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; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top