2011-09-14 66 views
1

當我嘗試發佈數據並從具有部分視圖的視圖調用操作時,我沒有獲得部分視圖的模型數據,但是當我直接使用它時而不是它正確發送數據的部分視圖。@ Ajax.BeginForm中的Html.Partial不會將數據發佈到操作

<div id="mydiv"> 
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" })) 
    {   
     //Does not send data to action on post 
     @Html.Partial("ViewUserControl1",Model.Emps) 
     //ViewUserControl1 contains the same next 8 line logic. 
     OR 

     //Send the data to actions on post. 
     for (int i = 0; i < Model.Emps.Count(); i++) 
     { 
      @Html.TextBoxFor(x => x.Emps[i].Name) 
      @Html.TextBoxFor(x => x.Emps[i].Address) 
      @Html.ValidationMessageFor(x => x.Emps[i].BBString) 
     <br />  
     } 

     <input id="dosomething" type="submit" value="save" /> 
    } 
</div> 


///On Controller 
    [HttpPost] 
    public ActionResult Index1(MyModel model) 
    { 
     ///Here i am looking for the model data which is null for partial. 
     return View(model); 
    } 

凡爲MyModel有一個列表EMPS {名稱,地址}

的有誰知道這樣做的原因。

+0

在這裏發表您'Index1'行動。 –

+0

'ViewUserControl1'部分包含什麼? –

+0

ViewUserControl1包含接下來的8行。 –

回答

2

我懷疑你的ViewUserControl1部分看起來像這樣(你沒有顯示它,你只是說它看起來像下面的8行,但顯然它不看這8行,因爲它使用了不同的視圖模型):

@model IEnumerable<Employee> 

for (int i = 0; i < Model.Count(); i++) 
{ 
    @Html.TextBoxFor(x => x[i].Name) 
    @Html.TextBoxFor(x => x[i].Address) 
    @Html.ValidationMessageFor(x => x[i].BBString) 
    <br />  
} 

通知失蹤Emps屬性的lambda表達式?這會爲輸入字段生成無效名稱,並且在回發時默認模型聯編程序不會獲取這些值。

我會建議你使用編輯器的模板,而不是局部的觀點,這樣的:

<div id="mydiv"> 
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" })) 
    {   
     @Html.EditorFor(x => x.Emps) 
     <input id="dosomething" type="submit" value="save" /> 
    } 
</div> 

,然後裏面~/Views/SomeControllerName/EditorTemplates/Employee.cshtml簡單:

@model Employee 
@Html.TextBoxFor(x => x.Name) 
@Html.TextBoxFor(x => x.Address) 
@Html.ValidationMessageFor(x => x.BBString) 
<br/> 

編輯模板將被渲染爲的每個元素Emps集合,以便您不需要編寫任何循環。它將爲輸入字段生成適當的名稱,以便默認模型聯編程序能夠在回發中填充值。編輯器模板的位置很重要。它必須放置在~/Views/Shared/EditorTemplates(如果您希望它在多個控制器之間重複使用)或~/Views/SomeControllerName/EditorTemplates(如果您希望它僅在給定控制器的視圖之間重用)內部。模板的名稱也很重要。它應該與集合的類型相同。因此,例如,如果您的視圖模型中有一個公共IEnumerable<Employee> Emps { get; set; }屬性,則必須將該模板稱爲Employee.cshtml,以便爲該集合的每個元素自動呈現該模板。