0

オブジェクトAのインスタンスをオブジェクトBの中に埋め込みたいのですが、オブジェクトBのフォームをレンダリングするアクションと編集ビューがすでにあります。Bを受け入れる強く型付けされた部分ビューにしました。

現在、Createアクションを扱っているので、b = new B();を実行します。bA = new A();

次に、Bのフォームをレンダリングしてから、Aの部分ビューを呼び出して、bAを渡します。

しかし、私が返すのは、FormCollectionか、Bフィールドがnullに設定された新しいAオブジェクトのいずれかです。最初のケースではすべてが順調ですが、フォームが失敗した場合はどうすればよいですか?間違ったデータを使用してオブジェクトを手動で作成し、無効なModelStateを使用してオブジェクトを再度渡す必要がありますか?2番目のオプションは可能ですか?

または、ネストされたビューを使用しないようにする必要がありますか?別の方法として、AとBの両方のすべての値を含むフォームを処理するためだけに特別なモデルオブジェクトを作成し、このフォームが検証されるときに、AオブジェクトとBオブジェクトを手動で入力して保存することを考えました。 。これが唯一の解決策ですか?

4

3 に答える 3

1

説明したように、AとBを使用できるはずです。

次のものがあるとします。

public class B {
    public A A {get; set;}
    public string X {get; set;}
    public int Y {get;set;}
}

public class A {
    public string Z {get; set;}
} 

//then in your controller:

public ActionResult Edit () {
    return View ( 
        new B {
            A = new A { Z = "AyyZee" } ,
            X = "BeeEcks",
            Y = 7
        } );
}

したがって、モデルはBのインスタンスです。

ビューとネストされた部分ビューは、次のようなHTMLを生成する必要があります。

 <input type="text" name="A.Z" value="AyyZee" />
 <input type="text" name="X" value="BeeEcks" />
 <input type="text" name="Y" value="7" />

これで、デフォルトのモデルバインダーがこれを接続できるようになります。

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Edit (B input) {
    // apply changes
    //the binder should have populated input.A
}

これは、AとBの両方にデフォルトのコンストラクターがあり、比較的単純なクラスである場合にのみ機能することに注意してください。より複雑なものがある場合は、独自のバインダーを使用できます。

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Edit ( [ModelBinder( typeof( BBinder ) )] B input) {
    //...
}

public class BBinder : IModelBinder
{
    public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext )
    {
        return  
            new B {
                A = new A { Z = Request["A.Z"] } ,
                X = Request["X"],
                Y = int.Parse(Request["Y"])
            };
    }
}
于 2009-09-11T14:25:39.753 に答える
1

AとBを組み込んだ独自のカスタムモデルを作成し、フォームを送信するときにそのモデルからビューを作成すると、カスタムモデルを更新し、個々のモデルを更新/追加することができます。

public class CustomViewModel
{
    public ModelA myAModel {get;set;}
    public ModelB mybModel {get;set;}
}

そのモデルのビューは、AとBを組み込んだフォームを作成し、投稿されたフォームコレクションを使用して各モデルの値を設定し、更新/作成してから個別にすることができます。

于 2009-09-11T14:28:05.597 に答える
0

このコードに関する私の問題は、両方ともモデルクラスの2つの原因によって引き起こされました。

  1. フィールドはプロパティである必要があり、通常のフィールドではありません
  2. 内部オブジェクトを初期化するコンストラクターがありませんでした

したがって、上記のソリューションのクラスは次のようになります。

public class B {
  public A a {get; set;}
  public string x {get; set;}
  public int y {get;set;}
  public B() {
    a = new A();
  }
}

public class A {    
  public string z {get; set;}
  public A() {}
 } 
于 2009-09-14T08:32:29.630 に答える