【发布时间】:2011-02-15 17:45:30
【问题描述】:
我是 MVC 的新手,从版本 3 开始。我遇到了 MVC3 附带的 jQuery 重新排序列表的问题。
视图从我的模型的枚举中呈现:
@using (Html.BeginForm())
{
<ul id="questionlist" class="ReorderList">
@for (int i = 0; i < data.Count(); i++)
{
<li>
<span class="dragHandle"></span>
@Html.HiddenFor(x => data[i].ID)
@Html.HiddenFor(x => data[i].DisplayOrder)
@Html.TextBoxFor(x => data[i].QuestionText)
</li>
}
</ul>
<input type="submit" value="Save" />
}
当页面加载 jquery 时 init 就在列表中:
<script type="text/javascript">
$(document).ready(function () {
var unordered = $("#questionlist").sortable({
axis: 'y',
update: listUpdated });
});
function listUpdated(event, ui) {
$('input[name$="DisplayOrder"]').each(function (index) { this.value = index; });
}
</script>
正如您在订单更新后看到的那样,jQuery 正在更新映射到我模型上 DisplayOrder 属性的所有隐藏字段。
调试这个我可以看到值被正确地回传到控制器,业务对象被更新并正确地保存在 SQL Server 中。在表上运行查询,我可以看到所有内容都按应有的方式更新。
当用户单击“保存”按钮时,我的问题出现了,返回的 HTML 是原始顺序,而不是他们更改的顺序。 Fiddler 显示以原始顺序返回的 HTML,但 DisplayOrder 隐藏字段具有正确(更改)的值。 单击屏幕上的导航按钮以刷新视图会以正确的顺序呈现列表。我已经调试了渲染过程,一切似乎都以正确的顺序渲染,我还尝试用 OutputCaching 设置为 false 来装饰控制器,但是当然,它不起作用,因为 DisplayOrder 属性正在渲染正确的值。
我做错了什么让它错误地显示第一个回发,而不是后续的回发?
【问题讨论】:
-
对,我的意思是说当ActionResult返回视图时,说“回发”更容易。
-
没有找到任何反馈我决定直接从模型输出 html(未索引)并使用 jquery 构建和发布 json 更新到控制器,而不是让 MVC 引擎尝试从发布的键值对重建对象模型。
-
同样的问题,但我正在寻找一个不太复杂的解决方案,否则我可能会忘记在回发期间对服务器端的记录进行排序!
标签: jquery asp.net-mvc razor