我有一些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中取出并插入。
有人可以告诉我这是否可行以及如何实现?或者用另一种方式指导我做这件事?
答案 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代码有太多黑客攻击)。