我试图在其中显示具有某些自定义类型属性的类。 型号:
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不会发回任何值,如果整个模板没有任何回发对象是空的。即使您不想编辑数据,我仍然在考虑如何获取数据。但是使用编辑器模板可以做到这一点,我现在所有对象都填充了适当的数据。
答案 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
生成输入字段,因为它们的名称将被硬编码,并且根据您的对象层次结构将无法正确绑定。