我想知道如何在动态提取数据以填充我的视图时正确使用HTML帮助方法HiddenFor。
在尝试使用HiddenFor之前,我使用以下代码使用常规隐藏元素:
@Html.Hidden("Answers["+i+"].FormEntryId", entry.FormEntryId)
这会生成以下HTML:
<input id="Answers_0__FormEntryId" name="Answers[0].FormEntryId" type="hidden" value="d318afa2-42ba-4205-9f8a-9d7e6ad59ea4">
正如您所看到的,它非常脆弱,因为它依赖于字符串文字。然后我自己和另一位开发人员决定尝试使用HiddenFor,如下所示:
@Html.HiddenFor(x => x.Answers[i].FormEntryId, entry.FormEntryId)
这会生成以下HTML,请注意空值字段:
<input data-val="true" data-val-required="The FormEntryId field is required." id="Answers_0__FormEntryId" name="Answers[0].FormEntryId" type="hidden" value="">
x是我们ViewModel的替身。然而,一旦我们切换到这种方法,我们遇到了一个障碍,我们的id值没有填充。因此,我想知道,使用HiddenFor的正确方法是什么,以及在处理动态视图时是否可以这样做。视图模型如下所示:
答案 0 :(得分:2)
您实际上使用了HiddenFor
辅助方法的错误重载,您已经在Answers
集合上进行迭代,您只需要使用this overload,它只需将表达式作为单个参数:
@for(int i=0; i<Model.Answers.Count; i++)
{
@Html.HiddenFor(x => x.Answers[i].FormEntryId)
}
这将自己负责生成输入元素的正确id
和name
属性,以便将它们的值在Model / ViewModel对象中回发回控制器操作。
这应该对你有用。
如果您使用Model / ViewModel强类型化视图,则应始终使用Stringly Typed Helper方法,如TextBoxFor
,HiddenFor
,DropDownListFor
等,而不是普通的帮助方法,因为那些需要更多的工作,而强类型的将负责通过Form post回发输入元素的新值。
希望它有所帮助!