如何在MVC中绑定List <simpleobject>

时间:2016-10-02 22:15:15

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

以下是我的情景:

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 
 }

任何想法我在这里做错了什么?

2 个答案:

答案 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")) { 
...
}