Post 使用IEnumerable的MVC<;模型>;与Razor一起发布到控制器后为空

Post 使用IEnumerable的MVC<;模型>;与Razor一起发布到控制器后为空,post,model-view-controller,model,Post,Model View Controller,Model,我的模型 public class ActivityModel { public int Id { get; set; } public String Nick { get; set; } public String TripName { get; set; } [DisplayFormat(DataFormatString = "{0:hh\\:mm}", ApplyFormatInEditMode = true)] public TimeSpan? F

我的模型

public class ActivityModel
{
    public int Id { get; set; }
    public String Nick { get; set; }
    public String TripName { get; set; }
    [DisplayFormat(DataFormatString = "{0:hh\\:mm}", ApplyFormatInEditMode = true)]
    public TimeSpan? FromTime { get; set; }
    [DisplayFormat(DataFormatString = "{0:hh\\:mm}", ApplyFormatInEditMode = true)]
    public TimeSpan? ToTime { get; set; }
    public String FromPlace { get; set; }
    public String ToPlace { get; set; }
    public String activityType { get; set; }
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Timestamp { get; set; }
    public String Weather { get; set; }
    public int Difficulty { get; set; }
    public bool Reviewed { get; set; }
}
我的视图行如下所示

@model IList<ActivityModel>
    @for (int i = 0; i < Model.Count; i++)
{
    if (!(bool)Model[i].Reviewed)
    {
        <tr>
            @using (Html.BeginForm("Accept", "Overview", FormMethod.Post, new { activityModel = Model }))
            {
                @Html.AntiForgeryToken()
                <td>
                    @Html.DisplayFor(m => Model[i].Timestamp)
                    @Html.HiddenFor(m => Model[i].Timestamp)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].Nick)
                    @Html.HiddenFor(m => Model[i].Nick)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].TripName)
                    @Html.HiddenFor(m => Model[i].TripName)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromTime)
                    @Html.HiddenFor(m => Model[i].FromTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromPlace)
                    @Html.HiddenFor(m => Model[i].FromPlace)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToTime)
                    @Html.HiddenFor(m => Model[i].ToTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToPlace)
                    @Html.HiddenFor(m => Model[i].ToPlace)
                </td>
                <td>
                    @Html.TextBoxFor(m => Model[i].Difficulty, new { id = "Difficulty" })
                    <--!@Html.HiddenFor(m => Model[i].Difficulty)--!>
                    <div style="visibility:hidden">
                        @Html.HiddenFor(m => Model[i].Id)
                        @Html.HiddenFor(m => Model[i].Reviewed)
                        @Html.HiddenFor(m => Model[i].activityType)
                        @Html.HiddenFor(m => Model[i].Weather)
                    </div>
                </td>
                <td>
                    <input type="submit" name="btn_accept" value="Accept" />
                </td>
            }
        </tr>
     }
}
<input name="[0].Id" type="hidden" value="101">
<input name="[1].Id" type="hidden" value="202">
@model-IList
@for(int i=0;iModel[i]。时间戳)
@Html.HiddenFor(m=>Model[i].时间戳)
@DisplayFor(m=>Model[i].Nick)
@Html.HiddenFor(m=>Model[i].Nick)
@DisplayFor(m=>Model[i].TripName)
@Html.HiddenFor(m=>Model[i].TripName)
@DisplayFor(m=>Model[i].FromTime)
@Html.HiddenFor(m=>Model[i].FromTime)
@DisplayFor(m=>Model[i].FromPlace)
@Html.HiddenFor(m=>Model[i].FromPlace)
@DisplayFor(m=>Model[i].ToTime)
@Html.HiddenFor(m=>Model[i].ToTime)
@DisplayFor(m=>Model[i].ToPlace)
@Html.HiddenFor(m=>Model[i].ToPlace)
@TextBoxFor(m=>Model[i]。难度,新的{id=“难度”})
模型[i]。难度)--!>
@Html.HiddenFor(m=>Model[i].Id)
@Html.HiddenFor(m=>Model[i]。已审阅)
@Html.HiddenFor(m=>Model[i].activityType)
@Html.HiddenFor(m=>Model[i].Weather)
}
}
}
我的控制器是这个

public ActionResult Index()
{
    List<ActivityModel> activities_web = new List<ActivityModel>();    
    //someLogicForFilling
    return View(activities_web);
}

[HttpPost]
[ValidateAntiForgeryToken()]
public ActionResult Accept(ActivityModel activityModel)
{
    return RedirectToAction("Index");
}
public ActionResult Index()
{
列出活动\u web=新建列表();
//一些填充物
返回视图(活动网络);
}
[HttpPost]
[ValidateAntiForgeryToken()]
公共行动结果接受(ActivityModel ActivityModel)
{
返回操作(“索引”);
}
问题是,在ActionResult中,Accept是ActivityModel,它始终为空0。。。 现在我真的花了一整天的时间在这上面,我不知道问题出在哪里我尝试了近20种解决方案,但都没有效果


呈现页面并显示所有值是可以的,但是当我尝试发布它们时,就像什么都没有发布一样。

当发布的数据与用作HttpPost操作方法参数的类的属性结构匹配时,模型绑定将起作用

您当前的视图代码正在生成如下HTML代码

@model IList<ActivityModel>
    @for (int i = 0; i < Model.Count; i++)
{
    if (!(bool)Model[i].Reviewed)
    {
        <tr>
            @using (Html.BeginForm("Accept", "Overview", FormMethod.Post, new { activityModel = Model }))
            {
                @Html.AntiForgeryToken()
                <td>
                    @Html.DisplayFor(m => Model[i].Timestamp)
                    @Html.HiddenFor(m => Model[i].Timestamp)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].Nick)
                    @Html.HiddenFor(m => Model[i].Nick)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].TripName)
                    @Html.HiddenFor(m => Model[i].TripName)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromTime)
                    @Html.HiddenFor(m => Model[i].FromTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromPlace)
                    @Html.HiddenFor(m => Model[i].FromPlace)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToTime)
                    @Html.HiddenFor(m => Model[i].ToTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToPlace)
                    @Html.HiddenFor(m => Model[i].ToPlace)
                </td>
                <td>
                    @Html.TextBoxFor(m => Model[i].Difficulty, new { id = "Difficulty" })
                    <--!@Html.HiddenFor(m => Model[i].Difficulty)--!>
                    <div style="visibility:hidden">
                        @Html.HiddenFor(m => Model[i].Id)
                        @Html.HiddenFor(m => Model[i].Reviewed)
                        @Html.HiddenFor(m => Model[i].activityType)
                        @Html.HiddenFor(m => Model[i].Weather)
                    </div>
                </td>
                <td>
                    <input type="submit" name="btn_accept" value="Accept" />
                </td>
            }
        </tr>
     }
}
<input name="[0].Id" type="hidden" value="101">
<input name="[1].Id" type="hidden" value="202">
这是完整的代码(排除了一些属性以节省空间)

@model-IList
@foreach(模型中的var项,其中(a=>a.Revieved==false))
{
使用(Html.BeginForm(“Accept”、“Process”、FormMethod.Post))
{                   
@Html.AntiForgeryToken()
@DisplayFor(m=>item.FromPlace)
@Html.Hidden(“FromPlace”,item.FromPlace)
@DisplayFor(m=>item.ToPlace)
@Html.Hidden(“ToPlace”,item.ToPlace)
@Hidden(nameof(ActivityModel.Id),item.Id)
}
}

但理想情况下,如果您试图更新单个实体/记录的状态,则只需要该记录的
Id
(主键)。这意味着,您确实不需要填充所有属性。在这种情况下,您需要
Id
属性值的隐藏输入元素。如果需要,您始终可以使用此
Id
查询数据库以获取完整实体。(永远不要信任来自客户端的数据)

当发布的数据与用作HttpPost操作方法参数的类的属性结构匹配时,模型绑定将起作用

您当前的视图代码正在生成如下HTML代码

@model IList<ActivityModel>
    @for (int i = 0; i < Model.Count; i++)
{
    if (!(bool)Model[i].Reviewed)
    {
        <tr>
            @using (Html.BeginForm("Accept", "Overview", FormMethod.Post, new { activityModel = Model }))
            {
                @Html.AntiForgeryToken()
                <td>
                    @Html.DisplayFor(m => Model[i].Timestamp)
                    @Html.HiddenFor(m => Model[i].Timestamp)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].Nick)
                    @Html.HiddenFor(m => Model[i].Nick)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].TripName)
                    @Html.HiddenFor(m => Model[i].TripName)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromTime)
                    @Html.HiddenFor(m => Model[i].FromTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].FromPlace)
                    @Html.HiddenFor(m => Model[i].FromPlace)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToTime)
                    @Html.HiddenFor(m => Model[i].ToTime)
                </td>
                <td>
                    @Html.DisplayFor(m => Model[i].ToPlace)
                    @Html.HiddenFor(m => Model[i].ToPlace)
                </td>
                <td>
                    @Html.TextBoxFor(m => Model[i].Difficulty, new { id = "Difficulty" })
                    <--!@Html.HiddenFor(m => Model[i].Difficulty)--!>
                    <div style="visibility:hidden">
                        @Html.HiddenFor(m => Model[i].Id)
                        @Html.HiddenFor(m => Model[i].Reviewed)
                        @Html.HiddenFor(m => Model[i].activityType)
                        @Html.HiddenFor(m => Model[i].Weather)
                    </div>
                </td>
                <td>
                    <input type="submit" name="btn_accept" value="Accept" />
                </td>
            }
        </tr>
     }
}
<input name="[0].Id" type="hidden" value="101">
<input name="[1].Id" type="hidden" value="202">
这是完整的代码(排除了一些属性以节省空间)

@model-IList
@foreach(模型中的var项,其中(a=>a.Revieved==false))
{
使用(Html.BeginForm(“Accept”、“Process”、FormMethod.Post))
{                   
@Html.AntiForgeryToken()
@DisplayFor(m=>item.FromPlace)
@Html.Hidden(“FromPlace”,item.FromPlace)
@DisplayFor(m=>item.ToPlace)
@Html.Hidden(“ToPlace”,item.ToPlace)
@Hidden(nameof(ActivityModel.Id),item.Id)
}
}

但理想情况下,如果您试图更新单个实体/记录的状态,则只需要该记录的
Id
(主键)。这意味着,您确实不需要填充所有属性。在这种情况下,您需要
Id
属性值的隐藏输入元素。如果需要,您始终可以使用此
Id
查询数据库以获取完整实体。(永远不要相信来自客户端的数据)

是的,就是这样,名称创建不正确,但为什么如果我使用帮助程序,我认为它会正确创建。如果他们的名称不匹配,为什么要使用它们?因为您是在循环内创建的。如果要将模型绑定到
活动模型列表
(例如,如果要对一组记录进行编辑并将其一起提交,则创建的名称是正确的。您将使用
列表
作为http帖子