2014-05-08 75 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); 
} 

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

相关问题