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