我有一个带有多个小部件的屏幕(所有小部件都有不同的div)。我有一个表单,当我发布(使用jquery)时,它使用ajax更新单个表单。
我还想要刷新其他两个div(在表单之外)。在单个jquery ajax post回调上触发刷新多个不同div的最佳方法是什么?
答案 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");
}