ViewModel 看起来像这样:
public W { get; set; }
public WC WC { get; set; }
public List<TC> TCs { get; set; }
WC有一个相关的TC组。它们的关系由包含外键WCId
的 TC 映射。
在视图中,我有一个表单。在表单中,有WC的输入字段。然后,有一组 TC 取决于最多为 4 的计数。每个 TC 都有一个相关的 T,因为 TC 有一个外键TCId
。我试图确保在发布表单时TC具有相关TId
。TId
保存在 W 中的 T 列表中(即 @Model.W.T.ElementAt(someindex).TId
)。
如何提升 lambda 表达式以使用帮助程序在视图中生成此关系,以便相关控制器可以在 httppost 操作中使用它?
这是我现在正在做的事情:
<input type="hidden" value="@(Model.W.T.ElementAt(i).TId)"
name="TCs[@(i)].TId"
id="TCs_@(i)__TId" data-val="true"/>
我想做的是使用 @Html.HiddenFor
助手,但似乎无法让它工作,所以我只是使用了上面稍微动态但仍然硬编码的方法。注意:这有效,但是,我希望它更干净。
据我所知,你现在正在做的事情是唯一的方法。我不知道更简单的@Htm.HiddenFor(...)版本的方法。我也一直在处理类似的问题。不过,如果您认为可以重用上述模式,您仍然可以创建自己的显示/编辑器模板或其他更抽象的方式。当然,它们会比你"丑陋"但直接的方法更冗长和复杂。
我把它变成了一个帮助程序,并决定分享它,以防其他人遇到这个问题。
助手:
public static MvcHtmlString CustomHiddenFor(
this HtmlHelper html, object ListValue,
string ListName, int ListIndex, string ListItem)
{
return MvcHtmlString.Create(
string.Format("<input type="hidden" value="{0}" name="{1}[{2}].{3}" id="{1}_{2}__{3}" data-val="true"/>",
ListValue.ToString(),
ListName,
ListIndex,
ListItem
));
}
使用(请注意,这是从 i 是迭代器的循环中完成的,任何值都将在第一个位置到期):
@Html.CustomHiddenFor(Model.W.T.ElementAt(i).TId, "TCs", i, "TId")