2014-05-08 80 views
3

我正在使用一個對象但在對象內部我有一個屬性是對象列表。我想通過該對象與其中的列表對象,但列表是空的,當我提交我的表單。 我不知道如何處理這個。使用MVC Razor傳遞列表對象

public class VSTAttendance 
{ 
    public int MemberID { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public bool Attendant { get; set; } 
} 

public class ServiceAttendance 
{ 
    public int AttendanceID { get; set; } 
    public int AttendanceTypeID { get; set; } 
    public string AttendanceType { get; set; } 
    public DateTime Service { get; set; } 
    public int ServiceID { get; set; } 
    public string Speaker { get; set; } 
    public string Location { get; set; } 
    public int HeadCount { get; set; } 
    public int CategoryID { get; set; } 
    public string Description { get; set; } 
    public string ChurchNotes { get; set; } 
    public string ServingNotes { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime CreatedBy { get; set; } 
    public DateTime DateUpdate { get; set; } 
    public DateTime UpdateBy { get; set; } 
    public List<VSTAttendance> MemberAttendance { get; set; } 


} 

HTML

@using (Html.BeginForm("Attendance", "Home", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl, @class = "form-horizontal", role = "form" })) 
{ 
    <div class="form-group"> 
     <label for="inputSpeaker" class="col-sm-2 control-label"> 
      Speaker</label> 
     <div class="col-sm-6"> 
      @Html.TextBoxFor(m => m.Speaker, new { @class = "form-control", placeholder = "Speaker", type = "text", required = "required " }) 
     </div> 
    </div> 

<table class="table table-bordered table-condensed table-hover"> 
    <tr class="warning"> 
     <td></td> 
     <td>Name</td> 
     <td>Surname</td> 
    </tr> 
    @foreach (var item in Model.MemberAttendance) 
    { 
     <tr> 
      <td>@Html.CheckBox("Attendant")</td> 
      <td>@item.Name</td> 
      <td>@item.Surname</td> 
     </tr> 
    } 
    </table> 

<div class="form-group"> 
    <div class="col-sm-10"> 
     <button type="submit" class="btn btn-info"> 
     <span class="glyphicon glyphicon-ok"></span>Submit</button> 
    </div> 
</div> 

} 

回答

8

你必須使用替代的foreach和使用隱藏的。我已經測試了以下和完美的作品

@model ServiceAttendance 

@{ 
    ViewBag.Title = "Attendance"; 
} 

<h2>Attendance</h2> 

@using (Html.BeginForm()) 
{ 
    <div class="form-group"> 
     <label for="inputSpeaker" class="col-sm-2 control-label"> 
      Speaker 
     </label> 
     <div class="col-sm-6"> 
      @Html.TextBoxFor(modelItem => modelItem.Speaker) 
     </div> 
    </div> 

    <table class="table table-bordered table-condensed table-hover"> 
     <tr class="warning"> 
      <td></td> 
      <td>Name</td> 
      <td>Surname</td> 
     </tr> 
     @for (int i=0;i<Model.MemberAttendance.Count ;i++) 
     { 
      <tr> 
       <td>@Html.CheckBoxFor(it=>Model.MemberAttendance[i].Attendant) 
        @Html.HiddenFor(it => Model.MemberAttendance[i].Attendant) 
       </td> 
       <td>@Model.MemberAttendance[i].Name 
        @Html.HiddenFor(it => Model.MemberAttendance[i].Name)</td> 
       <td>@Model.MemberAttendance[i].Surname 
        @Html.HiddenFor(it=>Model.MemberAttendance[i].Surname)</td> 
      </tr> 
     } 
    </table> 

    <div class="form-group"> 
     <div class="col-sm-10"> 
      <button type="submit" class="btn btn-info"> 
       <span class="glyphicon glyphicon-ok"></span>Submit 
      </button> 
     </div> 
    </div> 

} 

所以,你所要做的就是用下面的

@for (int i=0;i<Model.MemberAttendance.Count ;i++) 
      { 
       <tr> 
        <td>@Html.CheckBoxFor(it=>Model.MemberAttendance[i].Attendant) 
         @Html.HiddenFor(it => Model.MemberAttendance[i].Attendant) 
        </td> 
        <td>@Model.MemberAttendance[i].Name 
         @Html.HiddenFor(it => Model.MemberAttendance[i].Name)</td> 
        <td>@Model.MemberAttendance[i].Surname 
         @Html.HiddenFor(it=>Model.MemberAttendance[i].Surname)</td> 
       </tr> 
      } 
+0

爲什麼我需要使用HiddenFor?它的目的是什麼? – Gericke

+0

考慮在你的循環中使用局部視圖,會讓你的代碼更清潔。 –

+0

這幫了我。此外,我的對象是一個ICollection,我必須將其更改爲List,以便模型正確傳回控制器。 –

2

檢查出的NuGet或這裏提供的BeginCollectionItem HTML幫助:https://github.com/danludwig/BeginCollectionItem

你可以看到在行爲上的更多信息這個博客:http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

默認的model binder期待的名字來以這種形式:

MemberAttendance[0].Prop = "prop" 
MemberAttendance[0].BoolProp = false 

所以你需要同樣的名字輸入:

<input type="checkbox" name="MemberAttendance[0].Attendant" /> 
<input type="hidden" name="MemberAttendance[0].Name" value="Nick" /> 
<input type="hidden" name="MemberAttendance[0].MemberId" value="1" /> <!-- the hiddens are to maintain state of the rest of the properties --> 

<input type="checkbox" name="MemberAttendance[1].Attendant" /> 
<input type="hidden" name="MemberAttendance[1].Name" value="Someone else" /> 
<input type="hidden" name="MemberAttendance[1].MemberId" value="2" /> 
1

你沒有輸出MemberAttendance任何部分回發更換的foreach什麼。你只是輸出它的內容。

你的代碼最小的變化將改變foreach

@for (int i=0; i<Model.MemberAttendance.Count; i++) 
{ 
    ...your current html 

    @Html.HiddenFor(m => m.MemberAttendance[i].MemberID); 
    @Html.HiddenFor(m => m.MemberAttendance[i].Name); 
    @Html.HiddenFor(m => m.MemberAttendance[i].Surname); 
    @Html.HiddenFor(m => m.MemberAttendance[i].Attendant); 
} 

如果這是你真正想做的事情。

相關問題