0

異物のモデルを含むモデルでデータ注釈の検証の問題が発生しています。

まあ言ってみれば

Class Foo
{
    public virtual Int Id {get; set;}

    [Required]       
    public virtual String Name {get; set;}
 }

 Class Bar
 {
    public virtual Int Id {get; set;}

    [Required]
    public virtual String AnotherName {get; set;}

    public virtual Foo foo  {get; set;}
 }

BAR の作成中、FOO は必須ではありません。

しかし、BAR の HTTPPOST で ModelState を確認しようとすると、モデルの状態が無効であると表示され、FOO の列が欠落していると報告されます。

[HTTPPOST]
public ActionResult SaveBar(BAR bar)
{
if (ModelState.IsValid)
    SaveBar(bar);

} 

TryUpdateModel を試したときに FOO を null に設定しましたが、それでも役に立ちませんでした。

EDIT 私はエンティティを扱っており、モデルを表示していません

また.. BARをバインドするときにFOOをチェックしないようにモデルバインダーに指示する方法...

EDIT 修正例..

4

4 に答える 4

2

「SaveBar()」を押すと、モデル バインダーが Foo を Bar オブジェクトのメンバーとしてインスタンス化しているようです。したがって、予想どおり、Foo の属性検証が起動します。

属性の検証を削除して、通常の「Foo」操作のコントローラーアクションから呼び出すカスタム検証メソッドのように、別のルートに進みます。「SaveBar()」は Foo のデフォルト状態をチェックし、それに応じてその検証を呼び出すかどうかを決定できます。

于 2013-04-19T19:47:20.193 に答える
0

[Required]モデルの ID には使用しないでください。ここでエンティティまたはビュー モデルを扱っているかどうかはわかりませんが、一般的には、id を設定解除できるようにする必要があります。エンティティの場合、ID はデータベースに保存されるまで設定されません (通常)。ビュー モデルの場合は、以前に保存されていない (したがって ID がない) エンティティを表している可能性があります。 .

[Required]実際の用途は 2 つしかないため、それらが何であるかを正確に理解し、それに応じて属性のみを適用する必要があります。

1) エンティティでは、 [Required]NOT NULL を意味します。他のすべてのスカラー型はデフォルトで NOT NULL であるため、実際には文字列でのみ意味があります。

2) POST からフォーム データを受け取るために使用されているビュー モデル。これには、フィールドが空白でないことが必要です。あなたのIDが入力のためにユーザーに提示されるフォームフィールドでない場合(私はそれが非常に疑わしい)、それは必須ではありません.

于 2013-04-19T18:46:40.577 に答える
0

あなたが思っているようには機能しません。のModelStateフィールドが必須として宣言されているため、 は無効Fooです。Foo.Idビューがandの値を受け入れて渡さない場合Foo.Name、無効な が返されますModelState

于 2013-04-19T18:33:36.930 に答える