MVC - 列表中的 ICollection 不会 return 到 POST 上的控制器

MVC - ICollection within List won't return to Controller on POST

在我的编辑屏幕中,我似乎无法将模型中的 ICollection return 发送到 POST 上的控制器。为了简单起见,有2个模型,一个Pattern table:

[Table("Pattern")]
public partial class Pattern
{
    public Pattern()
    {
        PatternFeatureAssociations = new HashSet<PatternFeatureAssociation>();
    }

    [Key]
    public int PkID { get; set; }

    [Required]
    public string PatternNumber { get; set; }

    public DateTime? CreatedOn { get; set; }

    public int? CrearedBy { get; set; }

    public DateTime? UpdatedOn { get; set; }

    public int? UpdatedBy { get; set; }

    public virtual ICollection<PatternFeatureAssociation> PatternFeatureAssociations { get; set; }

}

还有一个 PatternFeatureAssociation table:

[Table("PatternFeatureAssociation")]
public partial class PatternFeatureAssociation
{
    [Key]
    public int PkID { get; set; }

    public int PatternID { get; set; }

    public int FeatureName { get; set; }

    public int FeatureDesc { get; set; }

    public DateTime CreatedOn { get; set; }

    public int CreatedBy { get; set; }

    public DateTime? UpdatedOn { get; set; }

    public int? UpdatedBy { get; set; }

    public virtual Pattern Pattern { get; set; }
}

然后我有一个包含以下内容的 ViewModel:

public class EditingViewModel
{
    public List<Pattern> patterns { get; set; }

    other values...
}

我的视图(这是部分版本)然后从 ViewModel 中消失:

@model TEST.ViewModels.EditingViewModel

@using (Html.BeginForm("Edit", "Patterns", FormMethod.Post))
{
<input class="btnSave" type="submit" value="Save Changes" />

<br /><br />

for (int s = 0; s < Model.patterns.Count; s++)
{
    @Html.HiddenFor(modelItem => Model.patterns[s].PatternNumber)
    @Html.HiddenFor(modelItem => Model.patterns[s].PkID)

    <p><b>Pattern Number: </b>@Html.DisplayFor(modelItem => Model.patterns[s].PatternNumber)</p>

    @foreach (var item in Model.patterns[s].PatternFeatureAssociations)
    { 
        @Html.HiddenFor(modelItem => item.PkID)
        @Html.HiddenFor(modelItem => item.PatternID)

        <h3>Feature Name</h3>
        <div>@Html.EditorFor(modelItem => item.FeatureName)</div>

        <h3>Feature Description</h3>
        <div>@Html.EditorFor(modelItem => item.FeatureDesc)</div>               
    }
}  
}

但是,当我单击保存并 return 到控制器时,ViewModel 不会 return PatternFeatureAssociations 数据。数据确实在 GET 到视图的过程中全部通过。

    [HttpPost]
    public ActionResult Edit(EditingViewModel searchedit)
    {
        return View();
    }

您需要使用 for 循环而不是 foreach 进行索引:

     @for(var i = 0; i < Model.patterns[s].PatternFeatureAssociations; i++)
        { 
            @Html.HiddenFor(modelItem => Model.patterns[s].PatternFeatureAssociations[i].PkID)
            @Html.HiddenFor(modelItem => Model.patterns[s].PatternFeatureAssociations[i].PatternID)        
            <h3>Feature Name</h3>
            <div>@Html.EditorFor(modelItem => Model.pattern    s[s].PatternFeatureAssociations[i].FeatureName)</div>    
            <h3>Feature Description</h3>
            <div>@Html.EditorFor(modelItem => Model.patterns[s].PatternFeatureAssociations[i].FeatureDesc)</div>               
    }

这将确保使用模型绑定器期望的预期命名约定生成相关输入。

Model Binding To A List