まず第一に、いくつかのコンテキスト:
ModelBinderに組み込まれているMVCによってオブジェクトに自動的に実体化されるいくつかのオブジェクトをポストバックするフォームがあります。
<input type="hidden" name="myobj[0].Id" />
<input type="text" name="myobj[0].Hours" />
<input type="hidden" name="myobj[1].Id" />
<input type="text" name="myobj[1].Hours" />
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(IList<MyObject> myobj);
さらに、DTO(DataTransferObjects)に投稿していることを強調したいと思います。これは、ラインマップをさらに下のエンティティフレームワークエンティティに変換するため、属性を追加する以外は、DTOの変更を望まないためです。
問題
ユーザーが「時間」に無効な値、たとえば「Fubar」を入力した場合、ModelBinderは当然「時間」プロパティを設定しようとしません。ただし、これはintであり、文字列ではないため、デフォルトは0です。
もちろん、これは私にとっていくつかの困難を引き起こします。ユーザーが実際に0を入力したのか、それとも無効な入力が原因であるのかがわからないためです。
ホームロールされたオブジェクトからエンティティ(Entity Framework)マッパーを使用しているため、「時間」プロパティのフットプリントをintに変更できませんか?。MVCには検証が組み込まれていることは承知していますが、MVCが激しく攻撃されており、ASP.NET MVC 2.0で新しい検証が行われることがわかっているため、実装はしません。
解決?
どのフィールドが正しくないかをユーザーに指摘できる必要があります。つまり、何らかのロジックを実行して新しいものをポストバックできる例外(または他の独創的な解決策?)をキャッチできる必要があります。ユーザーが間違ったことを明確にしたところをユーザーに表示します。
私の現在のアイデア:カスタムModelBinderを作成します。
何を指示してるんですか?