1

まず第一に、いくつかのコンテキスト

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を作成します。

何を指示してるんですか?

4

2 に答える 2

0

もちろん、ユーザーが実際に 0 を入力したのか、それとも無効な入力が原因だったのかがわからないため、これは私にとっていくつかの困難を引き起こします。

はい、できます。ModelState を調べます。

于 2010-01-25T17:43:27.677 に答える
0

これは特に理想的ではありませんが、他には何も変更したくないと述べています。したがって、カスタム ModelBinder を作成する、あなたが言及したオプションは正常に機能します。ただし、バインドするエンティティごとに ModelBinder を作成していることに気付く場合があります。

于 2010-01-25T19:48:09.847 に答える