如何在使用jquery发布后刷新多个div

时间:2010-03-20 16:57:08

标签: jquery asp.net-mvc post html

我有一个带有多个小部件的屏幕(所有小部件都有不同的div)。我有一个表单,当我发布(使用jquery)时,它使用ajax更新单个表单。

我还想要刷新其他两个div(在表单之外)。在单个jquery ajax post回调上触发刷新多个不同div的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

除非您修改服务器操作以返回所有需要更新的div(可能使用JSON编码的字符串)的相应HTML,否则无法在单个AJAX请求中实现此目的。


更新:

我想展示另一种技术。你可以有一个控制器动作,返回javascript。我们以下面的ASCX局部视图(RefreshPartials.ascx):

为例
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

$('#partial1Container').html('<%= Template.RenderPartialToString("~/Views/Home/Partial1.ascx", ViewData) %>');
$('#partial2Container').html('<%= Template.RenderPartialToString("~/Views/Home/Partial2.ascx", ViewData)%>');

RenderPartialToString is taken from here的位置(注:此方法可能存在一些缺陷,可能不适用于所有情况但您可以尝试)。接下来,您对控制器操作执行AJAX请求,该操作只是呈现此部分:

public ActionResult RefreshPartials()
{
    return PartialView("RefreshPartials");
}

您需要在ajax请求中指定dataType: script,以便评估前一部分中包含的javascript:

$.ajax({
    url: '/home/refreshpartials',
    dataType: 'script'
});

最后一个注意事项是正确转义RenderPartialToString方法的结果,因为它可能包含制动javascript的字符。这是您可能使用的一种方法:

public static string JsEscape(this HtmlHelper html, string content)
{
    content = Regex.Replace(content, "(\r\n)|(\r)|(\n)", @"\n", RegexOptions.Multiline);
    content = Regex.Replace(content, "(?<!\\\\)\"", "\\\"", RegexOptions.Multiline);
    return content;
}

所以最后你的部分看起来像这样:

$('#partial1Container').html('<%= Html.JsEscape(Template.RenderPartialToString("~/Views/Home/Partial1.ascx", ViewData)) %>');

您可以看到,您可以在此RefreshPartials.ascx中添加您喜欢的任何javascript,以使您的AJAX请求更加精美。

备注:这个想法取自Ruby On Rails Javascript Generators

答案 1 :(得分:1)

方式1.让您的帖子操作部分视图包含您将用于更新其他div的隐藏数据。我认为这比返回特殊的JSON或脚本代码要好得多。您可以使用.detach()而不是.clone()。

<div>Main post result data</div>
<div id="additional1" style="display:none">Moredata</div>

function onFormPostSuccess(data) {
   $("#result").html(data);
   $("#additional_div").html($("#result #additional1").clone().show());
}

方式2.在表单发布成功时,请执行额外的$ .get()以更新其他div。如果额外的数据很大,效果会更好;如果它很小,则#1更好。

function onFormPostSuccess(data) {
   $("#result").html(data);
   $("#addiotional_div").load("/additional_action/updated_info");
}