2017-03-26 16 views
1

私のウェブサイトが表すオブジェクトに使用しているビューモデルがあります。それをStudentとしましょう。ビューモデルの必須属性のオーバーライド

Add、Details、およびEditビューに同じビューモデルを使用することで、アプリケーションの混乱を最小限に抑えられました。

ただし、パスワードのような編集ビューで編集可能な要素はありません。そこで、私はこれらをビューから削除しました。

ただし、今やModelState.IsValidはポストバックにfalseを報告します。

これらのすべてのビューで同じビューを使用する方法はありますが、私の編集ビューで必要なステータスを何らかの形で上書きする方法はありますか?

注:私は隠しフィールドを使用することができたことを認識しています。しかし、私はクライアントなどにパスワードなどのデータを送信するのが快適ではありません。私はちょうどここにそれをすべて公開したくないのです。

+6

**ビュー固有の**ビューモデルの作成を検討しましたか?必要に応じて継承を使用します。 – Shyju

+0

属性はコンパイル時のメタデータであり、要求しているものに対して柔軟ではありません。既に提供されている提案の1つに追加すると、共通の基本ビューモデルを作成し、仮想のプロパティを持つことができます。ビュー固有のビューモデルでは、必要なプロパティをオーバーライドし、必要に応じて必要な属性を適用します。 – Nkosi

+0

@Shyju:はい、私はそれについて考えました。単純なものがなければ、私はそのアプローチを取るかもしれません。しかし、私は必要なモデルの数を最小限に抑えることに満足していました。 –

答えて

2

他の人が指摘しているように、この状況では通常、さまざまなビューモデルクラスが必要です。そして、これは継承を使ってより簡潔に達成することができます。

しかし、別のオプションがあります。完璧ではないが、私が探していたものに少し近い。

フォームがポストバックすると、エラーはModelStateに格納されます。問題のないいくつかのエラーがあることが分かっている場合は、これらをクリアすることができます。すべてのエラーをクリアすると、ModelState.IsValidfalseからtrueに変わります。

public ActionResult Edit(TrainerModel model) 
{ 
    ModelState[nameof(model.Email)]?.Errors?.Clear(); 
    ModelState[nameof(model.Password)]?.Errors?.Clear(); 

    if (ModelState.IsValid) 
    { 
     // 
    } 
    return View(model); 
} 
+1

しかし、それはクライアント側の検証をバイパスしますか? – Nkosi

+0

@ Nkosi:これらの入力フィールドを私のビューから削除したので、それは私の問題ではありません。ビューにこれらのフィールドがまだ残っていれば、明らかにクライアント側の検証は不平を言うでしょう。 –

関連する問題