使用MVC Razor传递列表对象

8

我正在使用一个对象,但是在对象内部有一个属性,它是一个对象列表。我想将该对象与其中的对象列表一起传递,但是当我提交表单时,列表为空。我不确定如何处理这个问题。

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>

}
4个回答

15

您需要使用for而不是foreach,同时使用Hidden for。我已经测试过以下代码并且完美运作。

 @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>

}

那么你需要做的是用以下内容替换foreach

 @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>
            }

为什么我需要使用HiddenFor?它的目的是什么? - Gericke
考虑在循环内使用部分视图,可以使您的代码更加简洁。 - Fernando Vezzali
这对我很有帮助。同时,我的对象是一个ICollection,为了使模型正确地传回控制器,我不得不将其更改为List。 - Dan Leksell

3
请查看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
默认的模型绑定器期望名称以以下形式出现:
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" />

2
你没有输出MemberAttendance的任何部分进行提交。你只是输出了它的内容。
对你的代码进行最小的更改就是改变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);
}

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

在技术方面,这句话没有明确的上下文或含义。

0

谢谢! 它与我一起工作

                            <input type="text" id="tenhangid" class="formelement"
                                   value="@Model.tempdetail[i].tenhang"
                                   new { onkeydown="return  event.keyCode != 13" }
                                   asp-for=@Model.tempdetail[i].tenhang
                                   name="@Model.tempdetail[i].tenhang"
                                   disabled="disabled"
                                   
                                   >





                        </td>


                        <td>
                            <form method="post" asp-controller="Home" asp-action="xoadetailtranferout">
                                <input type="hidden" asp-controller="Home" asp-action="xoadetailtranferout" name="idxoa" value=@Model.tempdetail[i].id />

                                <button class="btn1" type="submit" asp-controller="Home" asp-action="xoadetailtranferout">Xóa</button>

                            </form>


                        </td>


                        @Html.HiddenFor(m => m.tempdetail[i].tenhang );
                        @Html.HiddenFor(m => m.tempdetail[i].donvitinh);
                        @Html.HiddenFor(m => m.tempdetail[i].Expireddate);
                        @Html.HiddenFor(m => m.tempdetail[i].soluong);
                        @Html.HiddenFor(m => m.tempdetail[i].mahang);


                    </tr>

请不要将“谢谢”作为答案。相反,投票支持您认为有帮助的答案。-【来自审核】 - Ricky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接