1

目標

指定されたプロパティのみをモデルからビューに送信します。

シナリオ

しばらく前に、私のUserモデルは次のとおりでした。

public int Id { get; set; }

[Required]
public string Email { get; set; }

[Required]
public string Password { get; set; }

Idユーザーには、 、Emailよりも多くのプロパティがありますがPassword、それまでは使用していませんでした。このモデルの独自の提案は、アプリケーションで誰かを認証することだったからです。

時間が経ち、アプリケーションに新しいユーザーを追加する必要があります。これを行うために、Userのモデルを次のように拡張しました。

public int Id { get; set; }

[Required]
public string Email { get; set; }

[Required]
public string Password { get; set; }

[Required]
public string Firstname { get; set; }

[Required]
public string Lastname { get; set; }

それ以来、ログインできなくなりました —の代わりにModelState.IsValidme を返します。FalseTrue

問題は明らかだと思います: andFirstnameプロパティLastnameRequiredあり、何も送信していません。

問題

上記のシナリオに基づいて、私は尋ねなければなりません:異なる提案に同じモデルを使用する方法はありますか? または、必要に応じて、同じモデルを 2 回使用する方法はありますか? つまり、ユーザーの作成とユーザー認証には同じモデルが必要であり、以前と同じようにIsValidプロパティの値を取得する必要があります。true

4

2 に答える 2

2

(これは機能しません) BindAttribute を使用してみましたか:

public ActionResult Add([Bind(Include = "Id,Email,Password") ]User userModel .....

プロパティを除外するためにも使用できます。

バインド モデルは、送信されるモデルに特定のプロパティのみが設定されていることを確認するのに優れていますが、無効にするエラーがまだ含まれている ModelState には役立ちません。ソリューション:

  1. より単純なもの: @asymptoticFault によって提案されているように、さまざまなアクションに対して個別の viewModel を使用します。
  2. それが不可能な場合、または私のように自分を苦しめたい場合:)、ユーザーオブジェクトのカスタムモデルバインダーを作成できます。実行されるアクションのタイプに基づいて、特定のプロパティのみを設定し、他のプロパティは未設定のままにすることができますが、モデル状態エラーはありません。
  3. 上記のようなカスタム バインダーを実装しますが、今回は OnModelUpdated メソッドのみをオーバーライドし、実行中のアクションに基づいて、設定したくないフィールドの ModelState をクリアできます (これは、バインド属性)。

方法 2 と 3、特に方法 2 はやり過ぎかもしれませんが、Bind 属性を使って間違った道にあなたを導いた後、私は何か貢献すべきだと感じました :)

于 2013-08-19T18:22:37.427 に答える