猿问

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

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

我有一个ViewModel,它的成员之一是一个复杂的对象。复杂对象有4个属性(所有字符串)。我正在尝试创建一个可重用的部分视图,在其中我可以传递复杂的对象,并让它为其属性生成带有html帮助器的html。一切都很好。但是,当我提交表单时,模型绑定器没有将值映射回ViewModel的成员,因此在服务器端没有得到任何信息。如何将用户键入的值读入复杂对象的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)...

如何在表单提交时绑定这些数据,以便父模型包含从部分视图输入到web表单中的数据?

谢谢

编辑:我发现我需要添加“ComplexModel”。到部分视图(TextBox)中的所有控件名称,以便它映射到嵌套对象,但我不能将ViewModel类型传递给部分视图以获得额外的层,因为它需要是通用的,才能接受几种ViewModel类型。我可以用javascript重写name属性,但在我看来,这似乎过于简单了。我还能怎么做呢?

编辑2:我可以用新的{name=“ComplexModel.Name”}静态地设置name属性,所以我认为我在做生意,除非有人有更好的方法?


海绵宝宝撒
浏览 418回答 3
3回答

ABOUTYOU

我遇到了同样的情况,在这些信息丰富的文章的帮助下,我的部分代码更改为在由分部视图生成的输入元素中具有前缀。我使用了Html.PartialHelper,为Html.分部构造函数提供了ModelType的部分视图名称和对象,以及一个带有HTML字段前缀的ViewDataDictionary对象的实例。这将导致GET对“主视图”的“xyz url”的请求,并在其中使用前缀生成的输入元素呈现部分视图,例如,前面的name=“title”现在相应的HTML元素中变为name=“MySubTypet.itle”,对于表单输入元素的其余部分也是相同的。当向“xyz url”发出POST请求时出现了问题,希望将填写的表单保存到我的数据库中。但是MVC模型绑定器并没有将我发布的模型数据绑定到表单值中,而且ModelState也丢失了。视图数据中的模型也将变为空。最后,我尝试使用TryUppdateModel方法更新发布形式的模型数据,该方法采用模型实例和先前传递给部分视图的html前缀,现在可以看到模型与值绑定,模型状态也存在。请让我知道这个方法是好的还是有点多样化的!
随时随地看视频慕课网APP
我要回答