我有一个模型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
答案 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)
}
现在可以正常使用