我有一个视图模型:
public class MyViewModel
{
public MyObject myObject{ get; set; }
public List<MyList> myList{ get; set; }
}
我有一个视图,其中包含一个强类型为MyViewModel
此视图允许您输入MyObject属性的值,以及创建MyList对象列表。列表部分工作正常,虽然我认为这将是两者中更难的。
假设MyObject有一个属性Description
我创建了一个文本框来输入值:
@Html.EditorFor(x => x.myObject.Description);
文本框呈现的ID为MyObject_Description
...问题是当我将此帖子发布到我的控制器操作时,MyObject根本没有绑定(虽然列表项在收到适当的ID时也会这样做“MyViewModel_MyList [guid] .myListValue”)
我在这里做错了什么?
编辑:更多信息
视图的第一行是:
@model MyApp.ViewModels.MyViewModel
动作方法:
[HttpPost]
public ActionResult Create(MyViewModel myViewModel)
{
}
我正在将新的MyViewModel传递到局部视图中以开始......
public ActionResult Create()
{
MyViewModel model = new MyViewModel();
return PartialView(model);
}
编辑2
确定当我渲染包含我调用的表单的部分视图时:
@{Html.RenderAction("Create", "MyController");}
从@model IEnumerable<MyApp.Models.MyObject>
类型的视图中调用
(此视图显示当前存在的MyOject的列表,并在底部呈现partial以允许用户将另一个MyObject添加到DB)
答案 0 :(得分:2)
如果您还没有这样做,请尝试创建名为MyObject.cshtml的编辑器模板(例如,Views-&gt; Shared-&gt; EditorTemplates)。将部分视图内容移动到此视图,然后调用
@Html.Editor("myObject").
来自您的父部分视图。
答案 1 :(得分:0)
将ViewModel更改为直接具有描述
public class MyViewModel
{
public string Description { get; set; }
public List<MyList> myList{ get; set; }
}
然后相应地绑定
@Html.EditorFor(x => x.Description);
答案 2 :(得分:0)
我希望您的视图的顶行看起来像这样:
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>
这告诉视图它提供的模型是MyViewModel
类型(la <T>
样式)。
答案 3 :(得分:0)
我不认为开箱即用的模型绑定知道如何绑定到复杂对象。您可能需要编写某种自定义模型绑定器。
我担心这不是我自MVC1以来所做的事情所以我有点犹豫要不要给你任何示例代码,因为从那以后机制可能已完全改变了。快速谷歌确实出现了这篇文章http://www.learnxpress.com/asp-net-mvc-hosting-6-tips-for-asp-net-mvc-model-binding-2.html和本文http://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.html。
编辑:我刚看到这个答案可能对Retrieving data from view, should I use model binder?
有帮助