以下是我的情景:
public class ComplexObject
{
public int SomeProperty {get;set;}
public List<SimpleObject> Object {get;set;}
}
public class SimpleObject
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
我为SimpleObject
@model SimpleObject
<div>
<input type="button" value="Button" name="btn" />
<div>
<div>
@Html.TextBoxFor(Model => Model.FirstName, new { @class = "", @maxlength = "50" })
</div>
<div>
@Html.TextBoxFor(Model => Model.LastName, new { @class = "", @maxlength = "50" })
</div>
现在我想在另一个视图(MainView)中渲染这个局部视图。这个想法是用户可以单击SimpleObject局部视图按钮和 在MainView上再次生成相同的局部视图。这就是它的外观:
MainView
SimpleView -> Add
SimpleView -> Add
我可以创建一个ajax动作并生成简单视图并将其附加到mainview,但问题是simpleobject没有绑定到ComplexObject。
这是我在MainView中渲染partialview的方法。
@Html.Partial("_PartialView", Model.SimpleObject, new ViewDataDictionary(ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo
{
HtmlFieldPrefix = "Simple"
}
})
MainView在提交点击时调用控制器操作,并提交整个ComplexObject
。这里我的SimpleObject
列表始终为NULL。
public ActionResult CreateComplex(ComplexObject object)
{
// HERE LIST<SIMPLEOBJECT> is always NULL
}
任何想法我在这里做错了什么?
答案 0 :(得分:0)
第一次渲染局部视图时,您将得到以下内容:
<div>
<input type="text" name="FirstName" maxlength="50" />
</div>
<div>
<input type="text" name="LasttName" maxlength="50" />
</div>
当您向页面添加多个局部视图时,最后只有2个文本框将发布到服务器,因为它们都具有相同的名称。
要解决此问题,您必须更改部分视图以使输入框像数组一样,您可以向模型添加属性并从操作中设置它 假设您为模型添加了一个名为Index的属性,您的代码应如下所示
@model SimpleObject
<div>
<input type="button" value="Button" name="btn" />
<div>
<div>
@Html.TextBox("FirstName["+Model.Index+"]", new { @class = "", @maxlength = "50" })
</div>
<div>
@Html.TextBox("LastName["+Model.Index+"]", new { @class = "", @maxlength = "50" })
</div>
提交每个按钮后,您可以增加索引并渲染视图。
另一个解决方案是删除局部视图并使用JavaScript添加输入框,你可以使用Knockout
查看本文解释如何执行此操作:http://knockoutjs.com/examples/grid.html
答案 1 :(得分:0)
以下是我在原始问题中发布的代码所做的更改,以将SimpleObjects的列表绑定到ComplexObject。
@Html.Partial("_PartialView")
该课程如下:
public class ComplexObject
{
public int SomeProperty {get;set;}
public List<SimpleObject> Objects {get;set;}
}
并且partialview以BeginCollectionItem
开头@model AZSolutions.Framework.Model.SimpleObject
@using (Html.BeginCollectionItem("Objects")) {
...
}