1

私の問題は、チェックボックスのグループでのこの問題のカスタム検証に多少似ています

ビューモデルとして「ParentObject」を使用してレンダリングされるビュー(New.cshtml)にチェックボックスのグループがあります

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" />
}

領域のエディター テンプレートは \Views\Shared\EditorTemplates\RegionObject.cshtml にあります。

@model RegionObject
<p>
@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Code)
@Html.DisplayFor(m => m.Name)
</p>

RegionObject ビュー モデルは次のとおりです。

public class RegionObject
{
   public Guid Code { get; set; }
   public string Name  { get; set; }
   public bool IsChecked { get; set; }
}

「地域」の「必須」データ注釈が機能しないのはなぜですか? 地域に対して少なくとも 1 つのチェック ボックスがオンになっていることを確認します。「必須」でうまくいくと思っていましたが、どうやらそうではないようです。これを機能させるには、カスタム バリデータを作成する必要がありますか?

ありがとう。

4

1 に答える 1

2

Required 属性は、必要に応じてコレクションに対して操作することはできません。RegionObjectまた、このカスタム クラスから少なくとも 1 つのチェックボックスを選択する必要があることをどのように知ることができますか? IsCheckedこのコレクション内のプロパティをどのように関連付けると思いますか?

これを機能させるには、カスタム バリデータを作成する必要がありますか?

はい、それを実現するにはカスタム検証属性が必要です。例えば:

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);
    }    
}

その後:

public class ParentObject
{
    [AtLeastOneRegionMustBeChecked(ErrorMessage = "Please select at least one region")]
    public IEnumerable<RegionObject> Regions { get; set; }
}
于 2011-09-05T18:57:19.927 に答える