16

レコードの編集ページと挿入ページの両方に使用するビューとモデルがあります。ビジネス要件の 1 つは、特定のフィールドが編集時に必須であり、新規作成時に必須ではないということです。もともと、この特定の機能がドケットに追加される前は、次のようなモデルがありました。

[Required(ErrorMessage = "*")]
[Range(0.0, (double)decimal.MaxValue)]
[DisplayName("Cost")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public decimal ProposedCost { get; set; }

挿入フォームの場合は必要なプロパティを削除するか、編集フォームの場合は追加したいと思います。より良いアプローチは何ですか?私の他のすべての検証は上記のように行われます。または、モデルの状態を変更できますか? 考え?

編集

私が明確にしなければならないことは、彼らはまだ必要ではなく、新しいものにコストを挿入することが許可されているということです.

4

4 に答える 4

36

MVC3/.NET4 を使用している場合は、IValidatableObject特にそのような目的のために存在する which を使用できます。

ScottGuの引用、

...IValidatableObject インターフェイスを使用すると、モデル レベルの検証を実行でき、モデル全体の状態に固有の検証エラー メッセージを提供できます....

あなたのモデルは次のようになります

public class MyViewModel : IValidatableObject
{
    public long? Id { get; set; }
    public decimal? ProposedCost { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
        if (Id != null && ProposedCost == 0) {
            yield return new ValidationResult("ProposedCost must be provided.");
        }
    }
}

そしてコントローラーで、

[HttpPost]
public ActionResult Submit(MyViewModel model)
{
    if (!ModelState.IsValid) {
        //failed - report an error, redirect to action etc
    }
    //succeeded - save to database etc
}

それ以外の場合、最もクリーンな解決策は、ビュー モデルを使用することです。UpdateViewModelプロパティが必要な場合と必要でCreateViewModelない場合です。

于 2013-07-31T12:52:05.240 に答える
3

MVC Foolproof ValidationプロジェクトのRequiredIf検証属性を使用できます。プロジェクトで使用して、必要な機能だけを有効にしました。

別の方法として、 を使用しRemoteAttributeてロジックを自分でメソッドに実装することもできます。

于 2013-07-31T12:45:55.313 に答える
1

次の方法で検証を試すことができます。

ModelState.Remove("ProposedCost");

または、次のようにモデルを拡張します。

public class NewModeViewModel : EditModeViewModel
{
   public new decimal ProposedCost { get; set; }
}

そして編集ビューに渡します。

于 2013-07-31T12:49:40.863 に答える