Post方法asp.net mvc 2中的数据为空

时间:2010-10-23 09:19:56

标签: asp.net-mvc-2

我试图在其中显示具有某些自定义类型属性的类。 型号:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
} 
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

控制器:

public ActionResult Testify(int id)
    {
        ComplexParent par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

        return View("Testify", par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {

        return View("Testify", pComplexParent);
    }

查看:

<% using (Html.BeginForm())
   {%>
<fieldset>
    <legend>Fields</legend>
    <%: Html.EditorFor(x => x.First) %>
    <br />
    <%: Html.EditorFor(x => x.Second.ChildName)%>
    <br/>
    <br/>
    <br/>
    <% Html.RenderPartial("SimpleChild", Model.First); %>
    <p>
        <input type="submit" value="Watch me :-)" />
    </p>
</fieldset>
<% } %>

说到Get的工作正常,我可以看到所有的数据。但是在post pComplexParent参数为空(复杂类的两个属性都为空)。可能我在这里遗漏了一些东西,但无法让这个工作...... 小附加:仅显示名称编辑器的视图部分使第二个子项不为null并且名称设置为Bob。但我不明白如何使用EditorFor或DisplayFor方法制作它。

更新:感谢Darin Dimitrov,他亲切地检查了我的所有代码并找到了导致此问题的原因。确切的问题是,如果你使用显示模板,asp.net mvc 2不会发回任何值,如果整个模板没有任何回发对象是空的。即使您不想编辑数据,我仍然在考虑如何获取数据。但是使用编辑器模板可以做到这一点,我现在所有对象都填充了适当的数据。

1 个答案:

答案 0 :(得分:2)

你的观点有点混乱。您正在使用编辑器模板以及第一个孩子的部分。表格中包含哪些字段并不十分清楚。我建议你只使用编辑器模板:

型号:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

控制器:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Testify(int id)
    {
        var par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

        return View(par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {
        return View(pComplexParent);
    }
}

查看:

<% using (Html.BeginForm()) { %>
    <%: Html.EditorFor(x => x.First) %>
    <%: Html.EditorFor(x => x.Second) %>
    <input type="submit" value="Watch me :-)" />
<% } %>

SimpleChild的编辑器模板(~/Views/Home/EditorTemplates/SimpleChild.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Models.SimpleChild>" %>

<%: Html.HiddenFor(x => x.Id) %>
<%: Html.EditorFor(x => x.ChildName) %>
<%: Html.EditorFor(x => x.ChildDescription) %>

现在,如果您想为两个子属性设置不同的编辑器模板,可以在包含它时指定编辑器模板名称:

<%: Html.EditorFor(x => x.First, "FirstChildEditor") %>

对应于~/Views/Home/EditorTemplates/FirstChildEditor.ascx或在您的模型中使用[UIHint]属性:

public class ComplexParent
{
    [UIHint("FirstChildEditor")]
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}

我建议使用Html.RenderPartial生成输入字段,因为它们的名称将被硬编码,并且根据您的对象层次结构将无法正确绑定。