【问题标题】:Load ascx via jQuery通过 jQuery 加载 ascx
【发布时间】:2011-06-03 14:00:33
【问题描述】:

有没有办法通过 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 中得到了这个错误::(

“DropDownList”类型的控件“ctl00_ddl”必须放置在带有 runat=server 的表单标记内。

感谢@Yads。但他的解决方案只适用于 html 标签。

【问题讨论】:

  • 不可能吗?有没有办法将 ascx 文件转换为 aspx?还是更好的方法?
  • 错误函数可以取一个请求对象,检查request.responseText找出错误是什么。
  • @Raika 您请求中的数据类型必须是 'html' 而不是 'json',顺便说一句,如果您想通知某人,则需要使用 @ 标签
  • @Yads。我是 jquery 的新手。你能用jquery更新你的答案吗? thnaks.... :P

标签: asp.net jquery webforms


【解决方案1】:

以 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');
    }
 });

【讨论】:

  • @Raika 是的,只是去添加->新项目->通用处理程序
  • @Raika 不用担心。我还假设 emmett 的解决方案有效:-)
  • @Yads。谢谢。我是更新问题。请帮我解决这个问题。
  • @Raika,试试包含的 ajax 调用。
  • @Raika 这终于可以在一般 ascx 上使用 asp.net 控件了吗?
【解决方案2】:
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();
}

【讨论】:

  • @Raika,创建一个 ashx 处理程序,该处理程序将执行 Emmett 建议的相同操作,而不是 ViewPage 对象创建一个 Page 对象。您也不需要 ViewDataDictionary。
  • @Raika 您可以在 WebForms 中创建 ashx 处理程序。我刚刚发布了一个解决方案。
【解决方案3】:

*.ascx 文件在服务器端(在 *.aspx 页面内部)呈现,而不是在客户端(在其中执行 JavaScript)。

一种选择可能是创建一个空白 *.aspx,将用户控件放在 *.aspx 页面上,然后通过 jQuery 获取该页面并将结果转储到页面上。

编辑

根据您的评论,我有另一个建议:

如果您正在开发一个 CMS 风格的应用程序,您应该构建您的 *.ascx 控件,以便它们是 compatible with the ASP.NET AJAX Toolkit。这将允许用户在不进行完全刷新的情况下向页面添加内容。

如果您真的想让用户满意,您应该查看Web Parts and ASP.NET AJAX,因为 Web 部件的设计目的是让用户可以自定义其页面上的内容。

【讨论】:

  • 我正在开发类似 CMS 的网络应用程序。我需要将我的应用程序的某些部分称为 ascx 文件。我不想回发页面。有更好的方法吗?我也不想加载所有部分。
  • @Raika - 如果您真的想以正确的方式做事,您将使您的页面支持 ASP.NET WebForms AJAX(UpdatePanel 等)并使您的控件与之兼容。这将允许您通过 AJAX 动态加载内容。
  • 谢谢。你能给我更多关于 web 部件的链接或 web 部件的完整教程吗?
  • @Raika - 我发布的最后一个链接包含指向 MSDN 上相应页面的链接。不幸的是,Web 部件可能会变得相当复杂,因此您必须阅读一些内容。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多