ASP.NET MVC 1.0 の ModelBinder での無効な値の処理
-
22-09-2019 - |
質問
まず最初にコンテキスト:
MVC の組み込み ModelBinder によって自動的にオブジェクトに実体化されるいくつかのオブジェクトをポストバックするフォームがあります。
<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 は当然、「時間」プロパティを設定しようとしません。ただし、デフォルトは 0 です。 整数 ではありません 弦.
もちろん、ユーザーが実際に 0 を入力したのか、それとも無効な入力が原因なのかが分からないので、これは私にとっては多少の困難を引き起こします。
ホームロールされたオブジェクトからエンティティ (Entity Framework) マッパーを使用しているため、「Hours」プロパティのフットプリントを次のように変更することはできません。 整数?. 。MVC には検証機能が組み込まれていることは承知していますが、これは激しく攻撃されており、ASP.NET MVC 2.0 では新しい検証機能が追加されることがわかっているため、実装は避けたいと考えています。
解決?
どのフィールドが間違っているかをユーザーに指摘できる必要があります。つまり、何らかのロジックを実行して新しいフィールドをポストバックできるように、何らかの方法で例外 (またはおそらく他の独創的な解決策?) をキャッチできる必要があることを意味します。ユーザーに表示して、ユーザーが何を誤ったのかを説明します。
私の現在の考え:カスタム ModelBinder を作成します。
何を指示してるんですか?
解決
ユーザーが実際に0を入力した場合、またはこれは不正な入力によって引き起こされた場合、今、私が見ることができないので、これは、ofcourseの私のためにいくつかの困難が発生します。
はい、できます。 ModelStateに見えます。
他のヒント
、あなたは他の変更は何もしたくないと述べました。あなたが言及したオプションので、カスタムModelBinderを作成する罰金を動作します。しかし、あなたがバインドすることを各エンティティのためModelBinderを作成する自分自身を見つけるかもしれません。