在更新时动态创建javascript函数

时间:2013-11-20 21:13:43

标签: c# javascript jquery asp.net ajax

我有一些C#代码可以在我的asp.net页面上动态构建一个javascript函数:

        string addresses = "function doAddresses() {" + Environment.NewLine;
        addresses = addresses + "var hostAddress = new Array();" + Environment.NewLine;
        //int i = 0;
        //int timeOut = 2;
        foreach (BusinessLayer.HostApplication host in hosts)
        {
            //if (host.Address1.Contains("5208 "))
            //    System.Diagnostics.Debugger.Break();
            var location = new BusinessLayer.HostLocations();
            location.GetByHostApplicationId(host.HostApplicationId);
            if (location.Count == 0)
                continue;
            addresses = addresses + string.Format("placePin({0}, {1}, '{3}', {4});{2}", location[0].Longitude, location[0].Latitude, Environment.NewLine, (host.Address1 + " " + host.FStreetSuffixId.StreetSuffixName.Replace("'", "\\'") + ", " + host.City + ", " + host.FStateId.StateAbbreviation).Replace("'", "\\'"),host.IsActive);

        }
        addresses = addresses + "}" + Environment.NewLine;
        ClientScript.RegisterStartupScript(GetType(), "markers", addresses, true);

这部分工作正常。现在在我的ASP.NET页面上,我有一个jQuery函数,它在加载时执行并调用这个动态函数:

$(function() {
    doAddresses();
});

再次,这很好。现在我要做的是我的页面上有一个超链接按钮,使用jQuery进行Ajax调用。这很好用,在Ajax调用之后,更新面板会更新:

$('a[id^=hypCat]').click(function () {
   var mnuId = $(this).attr("id").replace("hypCat", "");
   $('#<%= hfCategoryId.ClientID %>').val(mnuId);
   __doPostBack('<%= updHostsTable.ClientID %>', '');
   doAddresses();

});

一切正常,但我的doAddresses()功能已过期。显然,C#ClientScript.RegisterStartupScript()函数没有更新javascript。这甚至可能是不可能的,因为我不确定javascript代码是否可以像DOM元素一样从DOM中取出并插入。

有人可以告诉我这是否可行以及如何实现?或者用另一种方式指导我做这件事?

1 个答案:

答案 0 :(得分:0)

我会冒险猜测__doPostBack执行异步请求,然后立即触发doAddresses。它将在脚本返回之前执行,并使用正确的数据创建一个新函数,而不是在执行之前等待新函数。


我会直言不讳 - 这看起来像是草率的建筑。为什么要传回整个JavaScript函数,而不仅仅是函数的数据?你可以这样重组:

function doAddresses(dataArray) {
  for (var i = 0; i < dataArray.length; i++) {
    placePin(dataArray[0], dataArray[1], dataArray[2], dataArray[3]);
  }
}

枚举代码中的数据点没有任何实际优势,并且模糊了正在发生的事情的含义。如果你用服务器替换生成'doAddress'的函数,只是为placePin生成一个参数数组,并将[serialized]数组返回给客户端,那会更好。


现在,这并没有完全解决问题,但是通过一些jQuery魔术可以使这个工作。现在的目标是从服务器获取一组值到引脚,然后在服务器响应数据后执行doAddresses

有些事情应该有效:

var data = $('a[id^=hypCat]').closest('form').serializeArray();
data.push({ name: '__EVENTTARGET', value: '<%= updHostsTable.ClientID %>' })
$.ajax({
  type: 'POST',
  data: data,
  dataType: 'json',
  success: function(responseData) {
    doAddresses(responseData);
  }  
});

我不太清楚这对你有多实用 - 你可能已经有了更好的方法来处理异步回调函数。我不太清楚您在典型的ASP.NET前端中看到的函数的扩散 - 理想情况下,它们对__doPostBack有一些更好的异步补充,并且您可以稍微使用这个函数更顺利(我认为上面的jQuery代码有太多黑客攻击)。

相关问题