ASP.NET MVC和AJAX

13
我有一个视图,由顶部、左侧和底部标题以及一个主内容窗格组成。假设在AJAX请求期间,我需要更新顶部、底部和主面板的HTML(左侧标题应保持不变)。
我想知道最好的方法是什么。第一个想法是将主内容面板放入一个部分视图中,并有一个控制器操作返回PartialView。这行不通,因为当操作仅返回主面板的HTML时,无法更新顶部和底部标题。
因此,如果将顶部和底部标题放入各自的部分视图中,则需要我的控制器操作返回多个部分视图。这是否可能或者我完全偏离了轨道?
我看到可以将部分视图呈现为字符串,所以我认为我可以在操作中使用这种技术,返回一个JSON对象,其中包含3个属性,表示我需要更新的3个部分的HTML。但是,如果可能的话,这种方法对我来说感觉非常错误。
我另一个想法是只返回一个包含部分所需数据的JSON对象,并使用javascript构建HTML。但是,在javascript中构建UI似乎是一项困难的工作(主内容部分使用MvcContrib的GridView进行分页和排序)。

所以我希望您能提出关于处理这种情况最干净的方法的建议。同时,一个自适应的解决方案也是很好的:例如,如果用户禁用了JavaScript,则会在没有AJAX的情况下重新加载整个页面。


更新:

Andrew Siemer 建议 将每个部分放入自己的局部视图中,并执行多个ajax请求。这似乎是一个完全有效的方法,但不幸的是,在我的情况下,它并不适用,因为我在初始问题描述中忽略了以下细节:顶部标题实际上用于显示发生在主面板中的错误/信息消息。例如,如果在获取主面板模型时抛出异常,则需要显示错误消息。因此,只能进行单个请求以更新这两个面板。


你能看一下这个吗:http://stackoverflow.com/questions/7086440/mvc-validating-binded-to-entitiy-with-reference-to-other-entities,谢谢(不知道怎么直接联系您):)。谢谢! - cpoDesign
4个回答

9
您可以轻松地将每个部分放入自己的局部视图中。这样一来,一旦您的数据被提交/更改,就可以为每个视图进行jquery请求。然后,每个调用都可以推送到适当的部分。这是非常可行的,听起来像是正确的路径。
我不会期望您的控制器返回多个部分视图...因为这将打破SRP!
更新:根据您的更新...您仍然可以单独获取各个部分。这只需要在您的部分上加上一些ajax魅力,每个获取可以通过JSON请求返回一个错误块。如果有任何错误返回,则这些错误消息可以显示在标题中。或者...您可以在所有其他请求已经报告回来之后,使标题请求最后出现错误,此时每个局部视图都可以将其错误消息扔到会话变量中以进行错误状态...然后在标题中显示这些消息。
选择将每个部分作为自己的部分而不是一个超级请求的一个重要原因可能在初始设计中还不明显。由于每个部分都是单独控制的,因此您可以做一些花哨的事情,例如独立缓存每个部分,在一个区域提供更频繁的更新,等等。

感谢您的建议,Andrew。不幸的是,在我的初始描述中我错过了一个重要的细节,所以我恐怕这个建议在我的情况下无法应用。我已经相应地更新了我的问题。 - Darin Dimitrov

0

你可以在主视图中将顶部和右侧视图包含在隐藏的 div 中,在加载时将它们移动到正确的位置,这样如何?


0

我知道这个问题已经被回答了,但是我想提出一个建议:

  • Backbone.js 和 jQuery 模板可以轻松解决你的问题。

(只是留下这个建议供阅读此问题的人参考)


0

这是一个棘手的问题。怎么样?

为每个组件的顶部、左侧和主要部分设置部分请求,每个部分请求返回所需区域的部分视图。然后,每当主面板中有事件发生时,启动每个区域的部分刷新以更新它们。

或者将它们全部放在固定计时器上轮询新数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接