【问题标题】:Pass list objects with MVC Razor使用 MVC Razor 传递列表对象
【发布时间】:2021-11-18 03:30:00
【问题描述】:

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

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>

}

【问题讨论】:

    标签: c# asp.net-mvc-4


    【解决方案1】:

    您必须使用 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?这样做的目的是什么?
    • 考虑在循环中使用局部视图,会让代码更简洁。
    • 这对我有帮助。此外,我的对象是一个 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

    默认模型绑定器期望名称以这种形式出现:

    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" />
    

    【讨论】:

      【解决方案3】:

      您没有输出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);
      }
      

      如果那是你真正想做的事。

      【讨论】:

        【解决方案4】:

        谢谢! 这是我的工作

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

        【讨论】:

        • 请不要添加“谢谢”作为答案。相反,请投票给您认为有帮助的答案。 - From Review
        猜你喜欢
        • 2013-09-22
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        相关资源
        最近更新 更多