我有一个下拉列表表的每一行中,像这样的:如何使DropDownListFor使用项目ID而不是索引?
@Html.DropDownListFor(m => m.Transactions[i].CategoryID, ...)
,一切大多工作。我可以选择项目,提交表格,模型中有我更新的选择。到现在为止还挺好。
问题是这不是很可靠。由于每个下拉菜单的名称都是基于索引而不是ID,这意味着帖子值与生活在数据库中的实际项目之间的匹配基于索引。大部分时间工作正常,但如果项目列表在页面加载时间和用户执行回发时间之间发生变化,该怎么办?指数发生了变化,这意味着发布的数据不能正确匹配,并且发生不好的事情。或者我看到浏览器不正确地尝试在帖子之间的下拉列表中保留选择,但是因为项目列表正在改变(在页面刷新的时候项目#2现在可能是项目#3)并且一切都基于在指数上,错误的下拉得到错误的值。
所以基本上,我怎么能强制下拉菜单生成看起来更像这样一个名称和ID:
Transactions_CategoryID_12385652 // 12385652 is the CategoryID
,而不是这样的:
Transactions_4_CategoryID // 4 is the array index
,而且还有自动的好处捆绑?
编辑:我提到的第二个问题(输入值刷新后不正确地恢复)似乎只发生在Firefox。 https://bugzilla.mozilla.org/show_bug.cgi?id=46845
简短的回答是否定的。而且你甚至不会尝试更改'name'属性,因为这意味着模型绑定会失败。您需要在视图中包含模型'id'属性,以便'CategoryID'与其相关的'ID'匹配 - @@ Html.HiddenFor(m => m.Transactions [i] .ID)' –
@StephenMuecke隐藏的领域将有所帮助。即使交易清单发生变化(我提到的第一种情况),它也会确保我始终更新正确的交易。但它仍然不会阻止浏览器使用下拉列表中的值(第2种情况)。 – BradDaBug
对不起,我不明白你的意思是_浏览器可能会隐藏dropdowns_中的值吗? –