4

私のビュー モデルには、DropDownListFor によって選択された、[必須] null 非許容の int プロパティがあります。選択するリストが空の場合、ModelState.IsValid は true です。

私のモデルには Required int プロパティがあります:

public class MyModel
{
    [Required]
    public int PickedValue  { get; set;}

    IEnumerable<SelectListItem> Items { get; set; }
}

<select>Create ビューで、要素をレンダリングします。

@Html.DropDownListFor(model => model.PickedValue, model.Items)

私のコントローラーでは、model.Itemsリストが空の場合 (選択する要素がない場合)ModelState.IsValidは true です。

[HttpPost]
public ActionResult Create( MyModel model )
{
    if( ModelState.IsValid )
    {
        // true, and ModelState.Keys doesn't contain PickedValue because it was never POSTed.
    }
    //...
 }

さて、次の場合、問題は解決します。

  1. PickedValue( Nullable) int?、または
  2. <select>-に空のアイテムがある場合@Html.DropDownListFor(model => model.PickedValue, model.Items, ""、または
  3. クライアント側の検証が有効になっている場合 (アクションが起動されないため)。

のプロパティの一部が POST データから欠落している場合に強制する方法はありModelState.IsValidますか? これはデフォルトの動作ではないでしょうか?falseMyModel[Required]

4

1 に答える 1

5

あなたの場合、 PickedValue を nullable int にする方がおそらく良いと思います。DropDownList にアイテムがない可能性がある場合は、PickedValue の値として null を使用できます。

コメントへの返信

それは理にかなっていますが、私の元の質問には答えません... MyModel のプロパティの一部が [必須] であるが POST データにない場合、ModelState.IsValid を強制的に false にする方法はありますか? これはデフォルトの動作ではないでしょうか?

int、double、bool、および null 値を持つことができないその他のプリミティブに関しては、DefaultModelBinder が HTTP 要求でそれらのデータを受信しない場合でも、モデル インスタンスを構築する必要があります。したがって、モデルが構築され、プロパティがデフォルト値に初期化されます。int の場合、これはゼロに初期化されることを意味します。HTTP 要求で何も受信されないため、これは int が設定されないことを意味し、常にゼロになります。int に [Required] バリデーターではなく [Range] バリデーターを与えてみましたか? これにより、ゼロではないことが検証されます。

[Range(1, int.MaxValue)]
public int PickedValue  { get; set; }

私のコードではすでに一般的なパターンであるため、モデルの変更は避けたいと思います... さらに、モデル内のプロパティを null 可能にして、null にならないようにすることは、直感に反するようです。

それがコードの一般的なパターンであるからといって、それが正しいとは限りません。元の回答を繰り返す必要があります。ドロップダウン リストに項目がない可能性がある場合は、モデルで選択した値を許可する必要nullがあります。

これが、エンティティ レイヤーとビューモデル レイヤーを分離することをお勧めする理由の 1 つです。ドメイン エンティティでは、関係が必要になる場合があります。ただし、その関係を選択するためのフォームがユーザーに最初に表示されたときは、デフォルトまたは空の選択済みドロップダウン項目をユーザーに提供する必要があります。この場合、エンティティの外部キーは int である可能性がありますが、viewmodel の表現はNullable<int>. この理由だけでも、null でないことを確認するためだけに何かを nullable にすることは直感に反するとは思いません。ビューモデルでnull可能にすると、ユーザーに空の値を含むフォームを提供し、ユーザーに入力を要求できます.

于 2012-06-01T15:21:33.633 に答える