2

我有一个对服务器进行 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 网络表单模型的核心,但它确实使在 ASP.NET 中使用 AJAX 成为一件复杂的事情——非常容易逆流而上。微软肯定已经意识到回发/服务器端模型已成为过去?

我还意识到 Microsoft 有一些服务器端 AJAX 库可能会解决这个问题——但我仍然想知道是否有 ASP.NET 网络表单的本地解决方案。

有什么建议么?

4

4 回答 4

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。

于 2012-04-19T16:26:53.923 回答
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 请求指向页面。您可以使用网络服务。查询特定方法,然后动态加载用户控件,将其呈现为字符串并返回 HTML。因为您将 HTML 和代码放在用户控件中,所以您不必担心删除表单标签,并且您仍然可以像在页面上一样使用所有 asp 控件。

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

于 2012-04-20T10:52:13.103 回答
1

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

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

这只会发送您在“Response.Write()”中输入的内容...您仍然可以自由更改标题等。

于 2017-02-24T10:07:34.193 回答
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 表格标记。

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

于 2012-04-19T16:28:13.113 回答