ASP.NET和ajax响应

时间:2012-04-19 16:11:34

标签: asp.net ajax

我有一个主网页(“基页”),它对服务器进行ajax调用(使用jQuery)。服务器端页面(“Ajax页面”)是一个ASP.NET Web表单(此处没有使用MVC)。因为(在这种情况下)我使用GridView在ajax响应中呈现数据,所以我必须包含< form runat =“server”>标签

我的抱怨是 - 当基页接收到AJAX响应时,它会将其插入到DOM中,但因为AJAX响应由包含< form>的HTML标记组成。标签,这有时会导致嵌套的html表单,这很糟糕。

我意识到我可以使用jquery只将响应的一个片段插入到基页DOM中 - 或者我可以使用jquery随后删除有问题的< form>标签。但这些感觉就像笨重的解决方案。是否真的没有办法阻止ASP.NET页面使用< form>提供响应标签?我意识到表单标签是ASP.NET webform模型的核心,但它确实使得在ASP.NET中使用AJAX变得复杂 - 非常依赖游泳。当然,微软已经意识到回发/服务器端模式已成为过去?

我也意识到微软有一些可能解决这个问题的服务器端AJAX库 - 但是我仍然想知道ASP.NET网页是否存在本机解决方案。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

使用WebForms& AJAX多年来我都能理解你的挫折感。

通常在使用jQuery AJAX加载WebForm页面时,我将ajax类包装在我的页面周围,只是嵌套在表单中:

<html>
   <head></head>
   <body>
      <form runat="server">
         <div class="ajax">
            Content here..
         </div>
      </form>
   </body>
</html>

然后当我加载页面时,我只调用此ajax类:

$("element").load("http://domain.com/webpage.aspx .ajax");

这意味着form元素不会呈现在我的页面中,从而阻止了嵌套表单问题,但您的GridView仍然可以成功呈现为HTML。

答案 1 :(得分:3)

您可以将GridView添加到Web用户控件,然后将其渲染为如下字符串:

public static string ExecuteToString(this Control control)
{
    Page page = new Page();
    page.Controls.Add(control);

    StringBuilder sb = new StringBuilder();
    using (StringWriter writer = new StringWriter(sb))
    {
        HttpContext.Current.Server.Execute(page, writer, false);
    }
    return sb.ToString();
}

这意味着您无需将ajax请求指向页面。您可以使用Web服务。查询特定方法,然后动态加载用户控件,将其呈现为字符串并返回HTML。因为您将HTML和代码放在用户控件中,所以您不必担心剥离表单标记,您仍然可以像在页面上一样使用所有asp控件。

我不知道使用这种方法的性能成本,但我已经使用了一段时间,对我来说似乎很好。

答案 2 :(得分:1)

我正在处理同样的问题,我通过以下方式解决了这个问题:

Response.Write("whatever content")
Response.End()

这将只发送你放在“Response.Write()”中的内容......你仍然可以自由改变标题等。

答案 3 :(得分:0)

如果你的ajax服务器页面是一个aspx页面(例如:ajaxpage.aspx),你可以删除ajaxpage.aspx中的HTML makup,除了提到Page指令的第一行。所以它应该是这样的。

<%@ Page Language="C#" CodeBehind="ajaxpage.aspx.cs" Inherits="MyProject.ajaxpage" %>

在后面的代码中,您可以使用response.Write

返回数据
protected void Page_Load(object sender, EventArgs e)
{
   Response.Write("your markup to return here");
}

如果要返回某种(干净的)HTML标记/某些部分数据,我倾向于使用generic handler(例如:ajaxresponse.ashx)文件而不是aspx文件并返回来自

的数据
public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    context.Response.Write("<h3>Here is the Markup for UserDetails</h3>");
}

您不能在ashx文件上使用ASP.NET服务器控件。并且您不能拥有一个没有表单标签的服务器控件(例如:GridView)的页面。它应该放在表单标签内。请注意,像gridview这样的服务器控件只会呈现HTML表格标记。

就个人而言,如果我想获得一些清洁&amp;我希望使用ajax显示/注入我当前页面的受控HTML标记,我将使用ashx处理程序并编写我的代码以输出我所需的标记。与aspx文件相比,ASHX文件具有性能优势,因为它不会通过正常的ASPX页面生命周期(所有这些事件!)。