从传递给部分视图的嵌套复杂对象中获取值

我有一个ViewModel有一个复杂的对象作为其成员之一。 复杂的对象有4个属性(所有string)。 我试图创build一个可重用的局部视图,我可以传入复杂的对象,并使用html助手为其属性生成html。 这一切都很好。 但是,当我提交表单时,模型联编程序没有将值映射回ViewModel的成员,所以我没有得到任何东西在服务器端。 如何读取用户input到复杂对象的html助手的值。

视图模型

public class MyViewModel { public string SomeProperty { get; set; } public MyComplexModel ComplexModel { get; set; } } 

MyComplexModel

 public class MyComplexModel { public int id { get; set; } public string Name { get; set; } public string Address { get; set; } .... } 

调节器

 public class MyController : Controller { public ActionResult Index() { MyViewModel model = new MyViewModel(); model.ComplexModel = new MyComplexModel(); model.ComplexModel.id = 15; return View(model); } [HttpPost] public ActionResult Index(MyViewModel model) { // model here never has my nested model populated in the partial view return View(model); } } 

视图

 @using(Html.BeginForm("Index", "MyController", FormMethod.Post)) { .... @Html.Partial("MyPartialView", Model.ComplexModel) } 

部分视图

 @model my.path.to.namespace.MyComplexModel @Html.TextBoxFor(m => m.Name) ... 

如何绑定表单提交这些数据,以便父模型包含从部分视图input到Web表单上的数据?

谢谢

编辑:我想通了,我需要prepend“ComplexModel”。 在部分视图中的所有控件的名称(文本框),以便它映射到嵌套的对象,但我不能将ViewModeltypes传递给局部视图来获得额外的层,因为它需要是通用的接受几个ViewModeltypes。 我可以重写JavaScript的名称属性,但这似乎过分贫民窟给我。 我还能怎么做呢?

编辑2:我可以静态设置名称属性与新{名称=“ComplexModel.Name”}所以我觉得我在做生意,除非有更好的方法?

您可以将前缀传递给部分使用

 @Html.Partial("MyPartialView", Model.ComplexModel, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ComplexModel" }}) 

这会将前缀控制在name属性中,这样<input name="Name" ../>将成为<input name="ComplexModel.Name" ../>并正确绑定到typeof MyViewModel

编辑

为了使它更容易一点,你可以封装在一个HTML帮手

 public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string partialViewName) { string name = ExpressionHelper.GetExpressionText(expression); object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model; var viewData = new ViewDataDictionary(helper.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = name } }; return helper.Partial(partialViewName, model, viewData); } 

并将其用作

 @Html.PartialFor(m => m.ComplexModel, "MyPartialView") 

您可以尝试将ViewModel传递给partial。

 @model my.path.to.namespace.MyViewModel @Html.TextBoxFor(m => m.ComplexModel.Name) 

编辑

您可以创build一个基础模型,并在其中推入复杂模型,并将基础模型传递给部分。

 public class MyViewModel :BaseModel { public string SomeProperty { get; set; } } public class MyViewModel2 :BaseModel { public string SomeProperty2 { get; set; } } public class BaseModel { public MyComplexModel ComplexModel { get; set; } } public class MyComplexModel { public int id { get; set; } public string Name { get; set; } ... } 

那么你的部分将如下所示:

 @model my.path.to.namespace.BaseModel @Html.TextBoxFor(m => m.ComplexModel.Name) 

如果这不是一个可接受的解决scheme,您可能不得不考虑重写模型联编程序。 你可以在这里阅读。