2012-03-03 137 views
1

當我嘗試從包含相同部分視圖兩次的頁面傳回值時遇到問題。 我類definiton是象下面這樣:MVC,將頁面中多個部分視圖的值傳回

public class Account : IEntity 
{ 

    public decimal CurrentBalance { get; set; } 
    public List<Person> AccountHolders { get; set; } 
    //to get round the non-existing enum support in EF4.3 wrap enum to int 
    public int StatusValue { get; set; } 
    public AccountStatus Status { get { return (AccountStatus)StatusValue; } set { StatusValue = (int) value; } } 

    public DateTime AccountOpenDate { get; set; } 
    public DateTime AccountCloseDate { get; set; } 
    public DateTime AccountSuspensionDate { get; set; } 
    } 

它的人,這我爲一個局部視圖(用於單個的一個)的一個列表。

<fieldset> 
    <legend>Person</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Name) 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Age) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Age) 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 
</fieldset> 

在賬戶的創建頁面中,我包含了2個我創建的部分視圖,如下所示。

<div id="Person1"> 
     @Html.Partial("_CreateAccountHolder") 
    </div> 

    <div id="Person2"> 
     @Html.Partial("_CreateAccountHolder") 
    </div> 

當我看到什麼是貼後背,它所包含的值(姓名和年齡作爲人的屬性),我把在頁面的表單值,我有讓他們的拖車預期: CurrentBalance = 19個&狀態=關閉& AccountOpenDate = 12%2F12%2F2012 &名稱=穆斯塔法&年齡= 20 &名稱=索菲亞&年齡= 20 & AccountCloseDate = 12%2F12%2F2012 & AccountSuspensionDate = 12%2F12%2F2012

但是當我看看我的控制器上的創建方法我看到AccountHolder列表爲空。我試着用不同的簽名...... 公衆的ActionResult創建(賬戶personalaccount,人[]賬戶持有人) 公衆的ActionResult創建(賬戶personalaccount,列出賬戶持有人)

如果我只有人的一個局部視圖,並有我的控制器一樣這,我可以看到正確綁定的Person對象。 public ActionResult創建(賬戶個人賬戶,個人賬戶管理)

任何想法,我要去哪裏錯了?

回答

2

或者你可以手動指定前綴,當你把你的局部視圖。我有一點點寫了關於他們在這裏:

codenodes.wordpress.com - MVC3 Editor Templates

要創建一個模板編輯:

  • ,如果你不已經有一個文件夾,名爲「EditorTemplates」中的Web項目中的解決方案,然後在Views \ Shared文件夾中創建一個。
  • 添加一個新的局部視圖並將其命名爲您要渲染的模型,在您的情況下爲Person,因此您將其稱爲Person.cshtml(我知道局部視圖應該以下劃線「_」開頭,但是對於編輯器模板,它需要與模型命名相同)。
  • 將您的「_CreateAccountHolder」局部視圖中的代碼粘貼到新的Person.cshtml編輯器模板中。
  • 在創建頁面正是如此渲染你的賬戶持有人名單:
<div id="People"> 
    @Html.EditorFor(x => x.AccountHolders) 
</div> 

如果你需要有大約每個人單獨申報單,那麼你可以將這些添加到您的編輯模板。編輯器模板的好處在於,即使列表中有多個Person對象,只需要對該模板進行單一調用 - 無需循環或類似的任何東西,因爲模板會自動呈現每個Person對象。它還名外地正確以便例如,如果你有你的收藏2個Person對象應該回來後是這樣的:

AccountHolders[0].Name 
AccountHolders[0].Age 
AccountHolders[1].Name 
AccountHolders[1].Age 

這裏是爲您編輯模板代碼:

@model Person 

<fieldset> 
    <legend>Person</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Name) 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Age) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Age) 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 
</fieldset> 
0

我讀 [http://stackoverflow.com/questions/653514/asp-net-mvc-model-binding-an-ilist-parameter][1] 把2個部分的意見後理解我的問題相同的類型使視圖返回名稱和年齡對,沒有任何東西在第一對和第二對之間。我改變了看法parial如下,但是真的不喜歡它...

<div class="editor-field"> 
     @Html.TextBox("person[0].Name", "") 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("person[0].Age", "") 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("person[1].Name", "") 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBox("person[1].Age", "") 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 

現在回發類似下面,我可以在我的控制器讀取的IList ..

CurrentBalance = 19個&狀態=關閉& AccountOpenDate = 12%2F12%2F2012 &人%5B0%5D.Name =穆斯塔法&人%5B0%5D.Age = 19 &人5B1%%5D.Name =索菲亞&人5B1%%5D.Age = 20 & AccountCloseDate = 10%2F10%2F2012 & AccountSuspensionDate = 12%2F12%2F2012

0

首先,你應該與AccountModel的兩個實例,像創建CreateAccountModel:

public class CreateAccountModel 
{ 
    public Account Person1 { get; set; } 
    public Account Person2 { get; set; } 
} 

接下來,當你把你的局部視圖,您應該個別車型傳遞給他們,E。g:

<div id="Person1"> 
    @Html.Partial("_CreateAccountHolder", Model.Person1) 
</div> 

<div id="Person2"> 
    @Html.Partial("_CreateAccountHolder", Model.Person2) 
</div> 

現在MVC會自動爲所有帳戶字段添加前綴PersonX,因此所有字段都是唯一的。如果我正確理解您的方案來完成,這是使用編輯器模板,而不是局部的看法的一種方式

{ 
    var prefixData = new ViewDataDictionary { TemplateInfo = { HtmlFieldPrefix = "Person1" } }; 
    Html.RenderPartial("_CreateAccountHolder", new ViewDataDictionary(prefixData)); 
} 
相關問題