如何将表单从强视图类型发布到ViewModel?

时间:2011-03-31 23:26:37

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我有一个视图模型:

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)

4 个答案:

答案 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?

有帮助