迭代时使用Html.HiddenFor

时间:2012-05-13 19:54:04

标签: asp.net-mvc-3 html.hiddenfor

ViewModel如下所示:

public W { get; set; }
public WC WC { get; set; }
public List<TC> TCs { get; set; }

WC有一组相关的TC。它们的关系由包含外键WCId的TC映射。

在视图中,我有一个表格。在表单中,有WC的输入字段。然后,根据最多为4的计数存在一组TC。每个TC具有相关的T,因为TC具有外键TCId。我正在努力确保在发布表单时TC具有相关TIdTId保存在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帮助程序,但似乎无法使其工作,所以我只使用上面稍微动态但仍然硬编码的方法。注意:这是有效的,但是,我希望它更清洁。

2 个答案:

答案 0 :(得分:3)

你现在所做的是 - 据我所知 - 这是唯一的方法。我不知道更简单的@ Htm.HiddenFor(...)版本的方法。我一直在处理类似的问题。不过,如果您认为可以重复使用上面的模式,您仍然可以创建自己的显示/编辑器模板或其他更抽象的方式。当然,它们比你的“丑陋”但直接的方法更加冗长和复杂。

答案 1 :(得分:1)

我把它变成了帮手,并决定分享它以防其他人遇到这个问题。

助手:

    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")