如何在模型中填充集合的属性

时间:2017-05-01 09:26:47

标签: c# asp.net-mvc

我有一个模型Sample,其中包含一个List<QCItem>,它在构造函数中填充。

在我的Sample.Create.cshtml表单中,我有以下部分,用于填充模型中Mass中每个项目的List<QCItem>值:

@for (var itemCnt = 0; itemCnt < Model.Defects.Count(); itemCnt++)
{
    @Html.LabelFor(m => Model.Defects[itemCnt], Model.Defects[itemCnt].Criteria)
    @Html.HiddenFor(m => Model.Defects[itemCnt].Criteria, 
        new { @value = Model.Defects[itemCnt].Criteria })

    @Html.TextBoxFor(m => Model.Defects[itemCnt].Mass)
    @Html.HiddenFor(m => Model.Defects[itemCnt].Mass)
}

调试时,我可以看到Model.Defects控制器中Model中的每个项目都包含我在Mass中输入的TextBoxFor值,并且这些文本框旁边有正确的标签。

但是,我还需要为这些QCItem中的每一个分配Criteria,这就是我在上面添加HiddenFor字段的原因,但是当调试器到达控制器时,每个QCItem的{​​{1}}值为Criteria

如何以与null传递相同的方式将此值传递给控制器​​操作? (它应自动分配给正确的Mass)该值肯定存在,因为它显示在QCItem中。

更新

这是SampleController中的方法:

LabelFor

以下是具有所有属性的public ActionResult Insert(HttpPostedFileBase file, Sample sample) { SelectedPallet = (Pallet)Session["pallet"]; sample.Pallet = SelectedPallet; var access = new Access(); access.InsertNewQCSample(sample); var files = Request.Files; // Insert into database return View("Details"); } 模型:

Sample

以下是public class Sample : IGriddable { private DataRow dataRow; private DataRow row; public string[] ColumnHeaders { get; } = new string[] { "SampleNumber", "Date", "ClerkStatus", "SupervisorStatus" }; public string RowLinkPrefix { get { return $"/receiving/{Pallet.Grv.GrvNumber}/{Pallet.PalletSequence}/"; } } public bool Selectable { get; } = true; public Pallet Pallet { get; set; } public string Clerk { get; set; } public string MassOff { get; set; } public string ProductionComment { get; set; } public string Quantity { get; set; } public string Supervisor { get; set; } public string TechnicalComment { get; set; } public string SampleNumber { get; set; } public string ClerkStatus { get; set; } public DateTime Date { get; set; } public string SupervisorStatus { get; set; } public string ProductSpec { get; set; } // Each defect status needs to be saved as a (DB)subQCItems item public List<QCItem> Defects { get; set; } = new List<QCItem>(); public List<string> ImagePaths { get; set; } = new List<string>(); } 型号:

QCItem

2 个答案:

答案 0 :(得分:1)

您已经提供了Criteria媒体资源和internal设置者,而DefaultModelBinder无法设置它(需要public

public string Criteria { get; set; }

附注:

您的LabelFor()方法没有将标签与文本框相关联(点击它不会设置焦点。它必须是

@Html.LabelFor(m => Model.Defects[itemCnt].Mass, Model.Defects[itemCnt].Criteria)

Criteria的隐藏输入应该只是

@Html.HiddenFor(m => Model.Defects[itemCnt].Criteria)

Mass的隐藏输入毫无意义,DefaultModelBinder将忽略其值,因为您在隐藏输入之前对同一属性有TextBoxFor()

答案 1 :(得分:0)

感谢Stephen Muecke的评论(给出了我已经尝试过的建议)的帮助,我注意到Criteria属性有一个internal setter,无法从视图中访问。

将此更改为

public string Criteria { get; set; }

,格式为:

@for (var itemCnt = 0; itemCnt < Model.Defects.Count(); itemCnt++)
{
    @Html.LabelFor(m => Model.Defects[itemCnt], Model.Defects[itemCnt].Criteria)
    @Html.HiddenFor(m => Model.Defects[itemCnt].Criteria)

    @Html.TextBoxFor(m => Model.Defects[itemCnt].Mass)
}

现在可以正常使用