2016-10-02 13 views
0

綁定列表這裏是我的情況:如何<SimpleObject>在MVC

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 
} 

任何想法我在這裏做錯了什麼?

+1

自身一個'partial'不會起作用,因爲你不添加索引到'名稱「屬性。請參閱[這個答案](http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308)的一些選項 –

回答

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的輸入框,您可以用淘汰賽

看看這篇文章,解釋如何做到這一點:http://knockoutjs.com/examples/grid.html

0

這裏有我對原始問題中發佈的代碼所做的更改將SimpleObject的列表綁定到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")) { 
... 
}