没有完整PostBacks的ASP.NET JavaScript回调?

时间:2008-08-26 02:07:26

标签: asp.net javascript ajax

我即将在我公司的应用程序中启动一个相当Ajax的重要功能。我需要做的是每隔几分钟就让用户在页面上进行一次Ajax回调。

  • 我不需要在回调之前,之后或期间进行任何DOM更新。
  • 我不需要页面中的任何信息,只需要始终与请求一起发送的网站cookie以及ID值。

我很想知道的是,是否有任何干净简单的方法可以对ASP.NET页面进行JavaScript Ajax回调,而无需在页面上回发其余信息。如果可能的话,我不想这样做。

我真的只是希望能够在页面上调用单个方法,而不是别的。

另外,我仅限于ASP.NET 2.0,所以我不能使用任何新的3.5框架ASP AJAX功能,尽管我可以使用2.0 AJAX扩展来实现2.0框架。

更新
我决定接受DanP的回答,因为它似乎正是我正在寻找的。我们的网站已经使用jQuery来做某些事情,所以我可能会使用jQuery来发出请求,因为根据我的经验,它似乎比ASP的AJAX框架表现得更好。

您认为将数据传输到IHttpHandler的最佳方法是什么?我应该向查询字符串添加变量还是POST我需要发送的数据?

我认为我必须发送的唯一内容是单个ID,但我无法确定发送ID的最佳方法是什么,并让IHttpHandler处理它。我想提出一个解决方案,防止具有基本计算机技能的人意外或故意直接访问该页面或重复请求。这可能吗?

9 个答案:

答案 0 :(得分:6)

如果您不想创建空白页面,可以调用IHttpHandler(ashx)文件:

public class RSSHandler : IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";

            string sXml = BuildXMLString(); //not showing this function, 
            //but it creates the XML string
            context.Response.Write( sXml );
        }

        public bool IsReusable
        {
            get { return true; }
        }

    }

答案 1 :(得分:3)

您应该使用Asp.Net 2.0中引入的ASP.Net回调。这篇文章应该让你开始:

Implementing Client Callbacks Programmatically Without Postbacks in ASP.NET Web Pages

编辑:还看看这个: ICallback & JSON Based JavaScript Serialization

答案 2 :(得分:3)

  

您认为将数据传输到IHttpHandler的最佳方法是什么?我应该在查询字符串中添加变量还是POST我需要发送的数据?我认为我必须发送的唯一内容是单个ID,但我无法确定发送ID的最佳方法是什么,并让IHttpHandler处理它。我想提出一个解决方案,防止有基本计算机技能的人意外或故意直接访问该页面

考虑到回调被隐藏在客户端代码中,需要有同等决心的人获得查询字符串或POST请求。 IE,如果他们有萤火虫,你同样搞砸了。

所以,在这种情况下,做一些对你来说最简单的事(提示:我只是使用查询字符串)。

要处理重复请求/直接访问,我会生成一个随每个请求一起发送的密钥。也许是当前时间的散列(模糊,我会下降到几分钟,但不会因网络延迟而导致秒数)+客户端IP。

然后在HTTPHandler中,执行相同的哈希,只有匹配时才运行。

答案 3 :(得分:2)

您不仅限于ASP.NET AJAX,还可以使用任何第三方库(如jQuery,YUI等)来执行相同的操作。然后,您可以向您网站上的空白页面发出请求,该页面应返回包含Cookie的标题。

答案 4 :(得分:2)

我的投票也是HTTPHandler的建议。我经常使用这个。因为它不调用页面类的实例,所以它非常轻量级。

所有的ASP.NET AJAX框架技巧实际上都会在每个调用的后端再次实例化并创建整个页面,因此它们是巨大的资源占用。

因此,我将典型的XmlHttpRequest样式返回给HttpHandler。

答案 5 :(得分:1)

由于您只使用ASP.NET 2.0,我建议使用AjaxPro来创建.ashx文件。您所要做的就是将AjaxPro.dll拉入您的网站。我用AjaxPro开发了一个完整的应用程序,发现它运行得很好。它使用序列化来回传递对象。

这只是一个如何简单使用它的示例。

namespace MyDemo
{
  public class Default
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      AjaxPro.Utility.RegisterTypeForAjax(typeof(Default));
    }

    [AjaxPro.AjaxMethod]
    public DateTime GetServerTime()
    {
      return DateTime.Now;
    }
  }
}

通过JavaScript调用它就像

一样简单
function getServerTime()
{
  MyDemo._Default.GetServerTime(getServerTime_callback);  // asynchronous call
}

// This method will be called after the method has been executed
// and the result has been sent to the client.

function getServerTime_callback(res)
{
  alert(res.value);
}

修改

您还必须添加

      

到配置。 AjaxPro也可以与APS.NET Ajax并行运行,如果类标记为[Serializable],则可以将C#对象从Client传递给Sever

答案 6 :(得分:1)

为了提供不同的视角,您还可以在主页上使用PageMethod。戴夫沃德有一个很好的帖子,illustrates这个。基本上你使用jQuery ajax post来调用方法,如Dave的帖子所示:

$.ajax({
    type: "POST",
    url: "Default.aspx/GetFeedburnerItems",
    // Pass the "Count" parameter, via JSON object.
    data: "{'Count':'7'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
      BuildTable(msg.d);
    }
  });

根本不需要Asp.Net Ajax扩展。

答案 7 :(得分:-1)

您还可以使用内置于asp.net ajax库中的WebMethods。您只需在页面的代码隐藏上创建一个静态方法,然后从Ajax中调用它。

有一个非常基本的例子,说明如何做here

答案 8 :(得分:-1)

您应该使用网络服务(.asmx)。使用Microsoft的ASP.NET AJAX,您甚至可以自动生成存根。