Вы должны быть в состоянии использовать 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"])
};
}
}