有办法通过jQuery加载ascx文件吗?
更新
感谢“Emmett”和“Yads”我使用的处理程序有以下jQuery ajax代码:
jQuery.ajax({
type: "POST", //GET
url: "Foo.ashx",
data: '{}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response)
{
jQuery('#controlload').append(response.d); // or response
},
error: function ()
{
jQuery('#controlload').append('error');
}
});但我犯了个错误。我的代码错了吗?
另一个更新:我正在使用
error: function (xhr, ajaxOptions, thrownError)
{
jQuery('#controlload').append(thrownError);
}我得到的是:
无效的JSON: 测试=>(此测试是我的ascx中的标签)
和我的ascx文件后出错!
另一个更新:
我的ascx文件是这样的:
<asp:DropDownList ID="ddl" runat="server" AutoPostBack="true">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label1" runat="server">Test</asp:Label>但是在调用ajax时,我在asp::(
类型为“ctl00_ddl”的控件'DropDownList‘必须放在带有runat=server的窗体标记中。
多亏了@Yads。但他的解决方案只适用于html标记。
发布于 2011-01-04 19:05:49
以Emmett的解决方案为基础
public class FooHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
context.Response.Write(RenderPartialToString("Foo.ascx"));
}
private string RenderPartialToString(string controlName)
{
Page page = new Page();
Control control = page.LoadControl(controlName);
page.Controls.Add(control);
StringWriter writer = new StringWriter();
HttpContext.Current.Server.Execute(page, writer, false);
return writer.ToString();
}
public bool IsReusable
{
get
{
return false;
}
}
}使用以下jquery请求
jQuery.ajax({
type: "POST", //GET
url: "Foo.ashx",
dataType: "html",
success: function (response)
{
jQuery('#controlload').append(response); // or response
},
error: function ()
{
jQuery('#controlload').append('error');
}
});发布于 2011-01-04 18:47:01
public ActionResult Foo()
{
return new ContentResult
{
Content = RenderPartialToString("Foo.ascx", null),
ContentType = "text/html"
};
}
//http://www.klopfenstein.net/lorenz.aspx/render-partial-view-to-string-asp-net-mvc-benchmark
public static string RenderPartialToString(string controlName, ViewDataDictionary viewData)
{
ViewPage vp = new ViewPage();
vp.ViewData = viewData;
Control control = vp.LoadControl(controlName);
vp.Controls.Add(control);
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
vp.RenderControl(tw);
}
}
return sb.ToString();
}发布于 2011-01-04 18:43:25
*.ascx文件呈现在服务器端( *.aspx页面内部),而不是客户端(执行JavaScript的地方)。
一个选项可能是创建一个空白的*.aspx,将用户控件放在*.aspx页面上,然后通过jQuery获取该页面并将结果转储到页面上。
编辑
根据你的意见,我有另一个建议:
如果您正在开发一个CMS风格的应用程序,您应该构建您的*.ascx控件,使它们成为兼容ASP.NET AJAX工具包。这将允许用户在不执行完全刷新的情况下向页面添加内容。
如果您真的想为用户提供更好的服务,您应该查看Web部件和ASP.NET AJAX,因为Web部件是真正设计的,这样用户就可以自定义页面上的内容。
https://stackoverflow.com/questions/4597103
复制相似问题