2016-08-28 50 views
-1

我將List傳遞給了局部視圖,它工作正常,它顯示了所有數據,但是當我保存模型時,List返回null,我錯過了什麼?保存模型時,部分視圖列表返回null

  • 不注意對象,我寫了假的例子。

這個CSHTML:

@model ViewModels.StudentVM 

@using (Html.BeginForm("SaveStudent", "StudentsView", FormMethod.Post})) 
{ 
    @Html.AntiForgeryToken(); 
    <div class="row"> 
     <span>Student name:</span> 
     @Html.TextBoxFor(s => s.Name) 
    </div> 
    <div> 
     @Html.Partial("StudentsList", Model.Students) 
    </div> 
    <div class="form-group"> 
     <input type="submit" value="Save" class="btn"> 
    </div> 
} 

當裝載觀點我得到的所有學生視圖模型:

vm.Students = await _studentController.GetAllStudents(); // returned 20 Students. 

局部視圖:

@model IEnumerable<Entities.Students> 

<table class="table-bordered"> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.CheckBoxFor(modelItem => item.IsSelected) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
     </tr> 
    } 
</table> 

我想要獲得所有選定的學生,因此可以說我會選擇3名學生。 然後點擊保存按鈕。結果:雖然我選擇了3名學生,但Model.Students爲null。我怎樣才能讓這些學生?

+1

不能使用的部分,以生成用於控制一個複雜的對象,除非你通過'HtmlFieldPrefix'(參照[此答案](http://stackoverflow.com/questions/29808573/得到最值從 - 一個嵌套複合-OB ject-that-is-pass-to-a-partial-view/29809907#29809907)),但正確的方法是使用'EditorTemplate'作爲type of'Students'(參考[this answer](http:// stackoverflow如果你想要發佈任何有意義的內容 - 你需要一個ID屬性的輸入,例如:http://google.com/articles/30094047/html-table-to-ado-net-datatable/30094943#30094943) –

+1

'學生'對象 –

回答

1

您當前的局部視圖代碼只有調用DisplayNameFor助手方法,它只會將顯示名稱呈現爲標籤。如果要提交每個項目的數據,則需要使用視圖模型屬性結構生成具有匹配名稱的輸入表單字段。

假設你StudentVMStudents集合類型的IEnumerable<Students>

如果您HttpPost行動方法的參數是StudentVm類型的,你需要確保你的局部視圖生成與名稱輸入表單字段,如「學生[ 0]請將.Name , 'Students[1].Name等,您可以使用Html.TextBox輔助方法,並指定該自定義名稱

@model IEnumerable<Students> 
<table class="table-bordered"> 
    @{ 
     var counter = 0; 
    } 
    @foreach (var student in Model) 
    { 
     <tr> 
      <th>Name</th> 
      <td>@Html.TextBox("Students[" + counter + "].Name", student.Name)</td> 
     </tr> 
     counter++; 
    } 
</table> 

如果你只是顯示現有學生的名字,你並不需要的文本字段,可以簡體將其顯示在循環內部。在這種情況下,當表格提交時,爲什麼你擔心學生館藏是null?您正試圖保存將會在.Name財產中的新學生。因此,如果您需要再次使用現有的學生(但爲什麼?),則可以撥打GetAllStudents方法。

+0

我忘了寫主 - 我更新了我的帖子。實際上,每個學生附近都有一個複選框,我想讓所有選中的學生都返回,但返回null。例如:如果我選擇1個學生,那麼我將在我的列表中看到: 名稱:「學生姓名」,IsSelected:true。 所有其他學生將被選中:false。 –

+1

你應該考慮使用編輯器模板。看看[如何知道從HttpPost創建操作方法中選擇的複選框?](http://stackoverflow.com/questions/38961222/how-to-know-the-selected-checkboxes-from-within-the -httppost-create-action-metho) – Shyju

+0

@Shyju爲什麼不使用for循環代替計數器? –

0

說不定您使用2個不同的模型在圖...... 可以在1視圖模型 使用2模型這不是可以將所有數據(許多模型)通過必要的局部視圖

ViewModels.StudentVM != IEnumerable<Entities.Students> 

在1個視圖模型 :

var vm = new TestViewModel(); 
vm.one = db.one.tolist(); 
vm.two = db.two.tolist();