如何避免丢失 ASP.NET MVC 中的控件状态
我正在使用 ASP.NET MVC 2 并构建一个简单的业务应用程序。以下是一些详细信息:
该应用程序处理工作订单和 有工作订单索引视图。这 view 有一个列出工作的表格 命令和一些控件(文本 框、复选框和下拉菜单 列表)来选择标准 要显示哪些工单。
我正在使用视图模型。工单 索引视图有一个视图模型 每个的属性 控制。
我已经实现了类似的分页 回答中正在做什么 这个问题: 如何在 ASP.NET MVC 中进行分页? 我使用 LINQ 的 Skip() 和 Take() 作为 演示了,并且 ActionLinks 为 导航。
如果我加载页面但没有加载 操纵任何控件,我可以 单击页码 ActionLinks 并在之间很好地走动 工单页面。然而,如果我 改变一些东西,我的改变就丢失了 当我导航到另一个页面时。
例如,如果我在第 1 页并且 单击未选中的复选框,然后 然后点击第2页的链接, 将加载结果的第二页 但复选框将恢复为原来的状态 之前的状态。
我理解为什么会发生这种情况,但我想知道从设计的角度来看最好的做法是什么。
我能想到的潜在解决方案:
将所有控制值设置为路线 ActionLink 中的值。这 看起来真的很讨厌,并且可能会导致 在很长的 URL 或查询字符串中。实际上,现在我想起来,如果没有捕获控件值的方法,这是行不通的。由于 ActionLinks 不发布 任何东西,用按钮替换它们。 同样,这似乎是一个坏主意。
将 ActionLinks 更改为以下链接 触发一个执行以下操作的 jQuery 脚本 邮政。我认为这是最 到目前为止有希望的选择。做很多 开发人员这样做吗?
这似乎是一个很常见的问题,但这些选项都感觉不太正确。我想知道我是否错过了什么。
I'm working with ASP.NET MVC 2 and building a simple business app. Here are some of the details:
The app deals with work orders and
has a work order index view. The
view has a table listing the work
orders, and several controls (text
boxes, check boxes, and drop down
lists) to select the criteria for
which work orders to display.I'm using viewmodels. The work order
index view has a viewmodel with
properties for each and every
control.I've implemented paging similar to
what is being done in the answer to
this question:
How do I do pagination in ASP.NET MVC?
I'm using LINQ's Skip() and Take() as
demonstrated, and ActionLinks for the
navigation.If I load the page and don't
manipulate any of the controls, I can
click on the page number ActionLinks
and move around just fine between
pages of work orders. However, if I
change something, my changes are lost
when I navigate to another page.For example, if I'm on page 1 and
click an unchecked check box, and
then click on the link for page 2,
the second page of results will load
but the check box will revert to its
previous state.
I understand why this happens, but I'm wondering what is the best thing to do from a design standpoint.
Potential solutions I can think of:
Set all the control values as routeActually, now that I think of it this wouldn't work without a way to capture the control values.
values in the ActionLinks. This
seems really nasty, and could result
in very long URLs or query strings.Since ActionLinks don't post
anything, replace them with buttons.
Again, this seems like a bad idea.Change the ActionLinks to links that
fire off a jQuery script that does a
POST. I think this is the most
promising option so far. Do many
developers do it this way?
This seems like a common enough problem, but none of these options feel quite right. I wonder if I'm missing something.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
最好的办法是在用户分页时通过“记录”隐藏字段的更改来有效地模拟视图状态。为此:
1) 找出需要捕获的数据以及在 {ie -- json 对象数组} 中执行此操作的数据格式
2) 设置处理上一个/下一个的链接,以触发一个方法来收集“已更改”的内容并将它们填充到对象和隐藏字段中。
3)发布表单时,解析隐藏字段,提取数据和利润。
Best bet is to effectively simulate viewstate by "logging" the changes to a hidden field when a user paginates. To do so:
1) Figure out what data you need to capture and a data format to do so in {ie -- an array of json objects}
2) Setup the link that handles the prev/next to fire off a method to collect the "changed" things and stuff them into objects and into a hidden field.
3) When posting the form, parse the hidden field, extract data and profit.
当用户切换复选框时(使用 jQuery),您不能将更改保存回数据库吗:
Can't you just save the changes back to the database when the user toggles the checkboxes (using jQuery):
最后,我最终放弃了分页的 ActionLink,并用常规锚标记替换了它们。当前页面索引现在存储在隐藏表单值中:
然后我添加了以下 jQuery 脚本,该脚本设置隐藏页面值并在单击链接时提交表单:
问题已解决。
In the end, I wound up getting rid of the ActionLinks for the paging, and replaced them with regular anchor tags. The current page index is now stored in a hidden form value:
Then I added the following jQuery script, which sets the hidden page value and submits the form when a link is clicked:
Problem solved.