我有一个主网页(“基页”),它对服务器进行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网页是否存在本机解决方案。
有什么建议吗?
答案 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页面生命周期(所有这些事件!)。