【问题标题】:ASP .NET MVC partial views and routingASP .NET MVC 部分视图和路由
【发布时间】:2010-03-09 16:58:30
【问题描述】:
我有一个包含多个部分视图的 MVC 视图。这些部分视图是使用部分请求填充的,因此视图本身的控制器不会将任何数据传递给它们。如果在另一个视图中触发了某个操作,是否可以在其中一个部分视图中重新加载数据?例如,一个局部视图有一个 jqGrid,当用户在此网格中选择新行时,我想刷新另一个局部视图中的数据。
是否有此场景的代码示例(在 C# 中),我可以查看我做错了什么?我正在使用 ajax 调用来触发一个新请求,但没有刷新部分视图,所以我不确定问题是否与路由、控制器有关,或者这是否可能!
谢谢!
【问题讨论】:
标签:
c#
asp.net
asp.net-mvc
【解决方案1】:
如果您的局部视图操作返回 ViewResult,则响应包含一个 HTML 块。但是,Ajax 调用不会自动将结果插入 DOM,因为结果可以是任意数量的格式和/或在更新 DOM 之前可能需要额外的处理。因此,为了刷新局部视图,您需要获取 Ajax 调用的结果并将其插入 DOM 树中的正确位置。
jQuery 有一个漂亮的load() 方法,它将为您封装这个过程。它将进行 Ajax 调用,获取结果并替换所选元素的内部 HTML。如果您需要以任何方式转换结果,您甚至可以在将其插入 DOM 树之前将您自己的函数传递给它以执行。
旁注: jQuery.load() strips scripts returned in the result。它确实保留它们以在某些场景中执行,但它甚至不会在其他场景中执行它们。因此,如果您的局部视图包含脚本,您可能会考虑自己更新 DOM 树。
这一切都与您在服务器端运行的 C# 代码无关。
但是,您确实可以通过检查请求是否为纯 HTML 来使您的操作更智能一些,因此结果将由浏览器直接呈现,或者如果它是 Ajax 调用并且结果将被处理在进入 DOM 之前通过你的脚本。此检查是使用Request 扩展方法IsAjaxRequest 完成的。