0

次のViewModelがあります(読みやすいようにいくつかのプロパティを表示しています)

public class Contract{

public string Name {get; set;}

public ContractTerm PrpTerm { get; set; }

}

PRP用語モデルはこのようなものです

public class PrpTerm{

public int Id {get; set;}
public string Name {get; set;}

}

モデルの検証では、注釈を挿入するために XML ファイルを使用しています。Nameプロパティを必須として設定し、ContractTerm検証を指定せずに許可しました (リストのオプション フィールドです)。私の見解では、名前用のテキストボックスと契約期間用の選択リストがあります。

保存しようとすると、ModelState.IsValidプロパティが false として取得され、PRPTerm.Id値が必要であることが示されます。null値をintに代入できないためだと理解しています。

これが検証されるのを避ける方法を誰かが知っていますか?

Bind(Exclude アノテーションを使用してみましたが、これによりデータ送信からフィールドが削除され、ユーザーが選択した値を取得できなくなります (発生した場合)。PrpClass で id を null 許容として設定できません。もう 1 つのオプションは、ViewModel に PrpTerm Id を設定することですが、正当な理由でその変更を正当化する必要があります。

何か案が?

4

2 に答える 2

9

暗黙の[Required]属性は、定義により、(null 可能であるのとは対照的に) null 非許容である に適用さIdれます。intint?

この動作は、MVC で構成可能です。

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

デフォルトは true です。

Global.asax.cs で false に設定することで、この動作を無効にすることができます。

ただし、AFinkelstein が指摘しているように、実際の問題は ViewModel にあるようです。この便利なデフォルトの MVC をオフにするのではなく、再考することをお勧めします。

私は提案します

public class Contract
{
    public string Name { get; set; }
    public int? PrpTermId { get; set; }
}

おそらくあなたが実際に望んでいるものです。これを行う「正当な理由」に関しては、特定の ViewModel の目的が、それを構成するモデルの目的とわずかに異なる可能性があるため、ViewModel がモデルと異なることが多いことが一般的に認められています。

于 2012-05-04T04:09:12.127 に答える
1

プロパティを使用していない場合、PrpTerm クラスが View Model に適しているとは思えません。本当に必要なのは、ドロップダウン リストから設定された PrpTermName だけです。私は次のようなクラス構造を持っています

public class Contract
{
    public string Name { get; set; }
    public string PrpTermName { get; set; }
    public SelectList ContractTermList { get; set; }
}

ID はビュー モデルの一部ではないため、ID の検証について心配する必要はありません。

于 2012-05-03T16:26:36.473 に答える