MVC模型绑定到嵌套类

时间:2014-07-11 13:24:52

标签: c# asp.net-mvc model-binding nested-class

当我尝试创建一个新的' Flow' class嵌套类(' Action')总是在控制器中返回null

所以我在类中有类如下:

public class Flow
{
    private Action actionField
    private string nameField
    private bool enabledField
    ...
}

public class Action
{
    private ActionSchedule actionScheduleField
    private ActionParameter actionParameterField
    private nameField
}
public class ActionSchedule
...

一个' Flow'

的单一创建视图
@model ProjectZeus.Models.Flow
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

   @Html.TextBoxFor(model => model.name, new { @placeholder = "Flow name" })
   @Html.ValidationMessageFor(model => model.name)


   @Html.LabelFor(model => model.enabled)

   @Html.EditorFor(model => model.enabled)
   @Html.ValidationMessageFor(model => model.enabled)

@Html.Partial("FlowAction")
...

然后是每个子类的部分视图

@model ProjectZeus.Models.FlowAction

    @Html.TextBoxFor(model => model.name, new { @placeholder = "Action name" })
    ...

我尝试过创建类的实例并调用视图 - 错误,

我尝试在视图中创建类的实例 - 错误,

我尝试过不使用PartialViews:

@Html.TextBoxFor(model => model.action.name, new { @placeholder = "Action name" })

我用google搜索谷歌并googleedddd但没有运气,请帮忙!?

编辑:

实施客户模型绑定器似乎有点矫枉过正。这个页面描述了同样的问题,但解决方案代码不会为我编译''当前上下文中不存在名称'helper''? - http://danielhalldev.wordpress.com/2013/08/23/partial-views-and-nested-mvc-model-binding/

EDIT2:

为简洁起见,我更改了模型定义 - 模型实际上是从xsd自动生成的:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class D53ESBFlow
{

    private D53ESBFlowAction actionField;

    [Required]
    private string nameField;

    ...

    private bool enabledField;

    /// <remarks/>
    public D53ESBFlowAction action
    {
        get
        {
            return this.actionField;
        }
        set
        {
            this.actionField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;

编辑3(凹凸):

看起来&#39; binder&#39;正在创建属性而不是类对象? whereRu

4 个答案:

答案 0 :(得分:4)

你忘了{get;组;属性名称上的访问者?

答案 1 :(得分:1)

我在MVC 5,.NET 4.5,Visual Studio 2013中遇到了类似的问题。

这里有什么对我有用:添加一个构造函数,以便包含的类得到实例化,使它们像AntoineLev所说的属性(而不是变量),并将类添加到Binding中:

public class Flow
{
    public Action actionField {get; set; }

    public class Flow()
    {
        actionField = new Action();  // otherwise it shows up as null
    }
}

在控制器中,在绑定中添加整个类:

public ActionResult Create([Bind(Include="action,name,enabled")] Flow flow)
{
   ... 
}

您的里程可能会有所不同。

}

答案 2 :(得分:0)

我最终通过请求响应并按名称单独映射所有属性:

flow.action = new D53ESBFlowAction
    {
        name = Request["action.name"],
        ...

答案 3 :(得分:0)

我遇到了类似的麻烦,吉米博加德的这篇文章帮助了我。 Article here

查看生成的html将显示,在部分视图中,html不包含嵌套类的名称,因此默认情况下无法绑定它。如上面的一个答案中给出绑定声明解决了问题