2009-08-12 108 views
1

我的问题是关于从客户端动态生成的HTML/JavaScript调用服务器端事件(例如DeleteClicked)。我在我的网站上有一个现有的网页,它深深植根于.net。页面生命周期非常复杂,可以从页面中触发几十个事件。动态添加客户端脚本/ HTML调用服务器端事件

我们希望开始利用一些JQuery功能,并在页面已经加载后添加额外的链接和按钮。例如,我们希望在某些图像上显示一些悬停图形。小图标可以提供删除,编辑等功能。我希望将这些客户端创建的点击事件绑定到服务器端事件,而不必颠覆(或绕过)整个页面生命周期。

到目前为止,我能想到的唯一解决方案是在整个页面中植入隐藏的asp.net控件,并在客户端代码中手动强制隐藏控件上的click()。不幸的是,我不认为这是可以接受的,因为我不一定知道载入页面时可能需要调用的所有事件。我也不喜欢向客户发送大量不需要的标记。

我的问题有意义吗?任何帮助将不胜感激!

回答

0

我正在对那些被打开的旧问题做一些清理工作,这里最好的解决方案是ASP.NET MVC--这种事情的更好的框架!对于那些被迫使用Web窗体的人,我很抱歉我没有更好的解决方案。对于那些有尝试新事物的人,我强烈建议MVC!

0

如果你走的是隐藏的控制路线,并且你不知道可能需要在特定负载上调用的所有事件,那么你将不得不加载所有可能需要的隐藏按钮。通过这种方式,您始终可以确保拥有一个可以触发的控件,并将其发送回服务器。

您也可以只用一个'click'控制器来检查参数,看看它的执行情况,但这非常笨拙。

或者,您可以从您的服务器端代码暴露Web方法,它可以从您的JavaScript异步调用。通过这种方式,您可以执行操作而无需控件上的事件处理程序。

例如:

/// <summary> 
    /// Deletes the 'something'. 
    /// </summary> 
    /// <param name="id">The unique id of the 'something' to delete.</param> 
    [WebMethod(true)] 
    public void DeleteSomething(string id) { 
     //Insert business logic 
    } 

看看到的WebMethods(或AJAX如其他人所说的),我想你会发现它适合您的解决方案。

+0

使用WebMethods的问题是它可能会改变我的页面绑定到的基础数据。如果我然后从asp.net控件中触发事件(在其他AJAX调用并命中WebMethod之后),则此事件可能无效,因为控件可能不再存在。我需要一种方式让我的动态html/javascript使用常规页面生命周期。 WebMethods是“真正的AJAX”并绕过了页面生命周期。 – jakejgordon 2009-08-12 13:05:07

+0

如果您将'onsuccess'javascript处理程序挂接到您的web方法调用,则可以在事件通过web方法成功完成后使用javascript/jquery更新控件。你也可以挂钩失败的JavaScript处理程序,这样如果调用失败,你可以执行任何需要的清理。 – 2009-08-12 13:44:00

+0

这可能会变得更加温暖......我能看到的唯一明显的问题是,我们基本上必须对服务器执行2个请求来处理这些操作之一 - 一个执行WebMethod操作,onsuccess我们基本上必须重新加载页面(或适当的更新面板)。 – jakejgordon 2009-08-12 14:52:31

1

如果你真的想拥抱这个,你应该用稍微不同的方式来看待它。

  1. 所有执行该 “删除”的逻辑应该是一类 可重复使用
  2. 你的ASPX页面可以 然后调用这个类来执行 删除的地方,现在出现
  3. 您的jQuery可以使用AJAX请求调用Web服务 ,并且web服务可以引用与您的ASPX页面相同的类 。

您不仅通过这种方式获得代码重用,还意味着您可以在不使用UI的情况下测试代码。

+0

我有删除逻辑分解出来,也知道如何使用WebMethods - 但我不认为这将解决我的问题。这是我对另一个答案的评论的副本:使用WebMethods的问题是它可能会更改我的页面绑定到的基础数据。如果我然后从一个ASP发起一个事件。网络控制(在其他AJAX调用并命中WebMethod之后),事件可能无效,因为控件可能不再存在。我需要一种方式让我的动态html/javascript使用常规页面生命周期。 WebMethods是“真正的AJAX”并绕过了页面生命周期。 – jakejgordon 2009-08-12 13:06:56

1

虽然jQuery将是更轻量级(和更性感)的解决方案,你有没有想过在页面上拍几块UpdatePanels?这并不理想,但在没有太多额外编码的情况下,将Ajax功能添加到现有表单中是一种相对无痛的方式。

如果你对jQuery感兴趣,你可以选择WebMethod route,它将所有的功能都保存在一个页面中,甚至可以创建新的.aspx页面,jQuery将调用它来执行某些操作(例如,如果你有一个包含联系人的边栏,这可以移动到一个新的Ajax/Contacts.aspx页面,然后您可以通过jQuery调用进行编辑)。

+0

我很确定我们添加的功能对于更新面板来说太性感了。我们确实已经在页面上有几个UpdatePanel,但问题仍然存在。查看我添加到其他答案的其他评论。感谢您的帮助。 – jakejgordon 2009-08-12 13:09:17

0

不幸的是,我们没有找到一个很好的解决方案。这似乎是有效地混合.net事件和JQuery AJAX的唯一方法,就是如果你正在更新的元素是100%JQuery或100%.net事件。例如,如果您要动态地添加某种类型的对象(如带有一组链接的图片)(例如编辑和删除),那么链接应该都使用手动AJAX(即调用WebMethod的JQuery),然后使用JQuery更新DOM; 这两个链接都应该在更新面板中调用.net事件。如果你试图制作一个链接JQuery,而另一个链接是一个.net事件,那么你会得到一些问题.net不知道DOM已经被JQuery更新,你的事件可能会被搞砸。预测在DOM中设置哪些适当的ID是非常困难的,这样.NET就不会感到困惑(如果您使用的是JQuery)。当.NET 4.0发布时,它会变得更容易,因为您可以选择手动指定控件ID而不是.NET,从而生成它自己的疯狂ID。

0

怎么样在经典<%= 控制 .ClientId%>服务器端标记到JS?这有点麻烦,但也许是一个选项,让你可以一直使用.NET 4.0。

相关问题