• ASP.NET MVC中加载WebForms用户控件(.ascx)


    问题背景

    博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为“上一月”、“下一月”的链接生成"__doPostBack()"的js调用,如下图:

    目前发现它会带来两个问题:

    1. 不支持IE10;

    2. 某些电脑不允许执行__doPostBack。

    问题提炼

    前提:

    1. 我们想以最低的成本解决这个问题,也就是对当前代码尽可能少的改动。所以要尽可能重用现有的日历控件代码。
    2. 日历改为Ajax加载,点击“上一月”、“下一月”时Ajax更新日历内容。
    3. 用ASP.NET MVC处理Ajax请求。

    要解决的问题:

    如何在ASP.NET MVC Controller中加载包含WebForms日历控件的用户控件(.ascx),并得到其输出的字符串,然后将__doPostBack的代码替换为ajax调用代码。

    核心问题:

    如何在ASP.NET MVC Controller中得到用户控件(.ascx)输出的字符串。

    解决方法

    先看代码

    public ActionResult Calendar()
    {
        var page = new Page();
        var form = new HtmlForm();
        var calendar = page.LoadControl("~/Controls/CNBlogsCalendar.ascx");
        form.Controls.Add(calendar);
        page.Controls.Add(form);
        using (var sw = new StringWriter())
        {
            System.Web.HttpContext.Current.Server.Execute(page, sw, true);
            return Content(sw.ToString());
        }
    }

    代码很简单,但得到这个代码花了今天一上午时间。

    代码说明:

    • 必须要new Page(),只有Page才能LoadControl。
    • 必须要new HtmlForm(),因为日历控件必要要放在<form runat="server">之间。
    • 关键功臣是HttpContext.Current.Server.Execute,动态加载控件并输出字符串全靠它。这个功臣是在这篇文章中找到的(感谢Sam Mueller)。之前我用过的方法(继续不走寻常路:ASP.NET MVC中使用Web Forms用户控件)不仅麻烦,而且在这个场景下会有问题。

    代码运行结果:

    完整代码下载:

    https://files.cnblogs.com/dudu/CNBlogsDemoMvcAscx.rar 

  • 相关阅读:
    android获取sd卡路径方法
    Log4Net的使用
    asp.net网站发布
    用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站
    Asp.Net MVC 路由
    面试题:两个栈模拟队列&&两个队列模拟栈
    TextBlob Quick Start
    链表基本操作题
    leetcode341 扁平化嵌套数组
    细说浏览器输入URL后发生了什么
  • 原文地址:https://www.cnblogs.com/dudu/p/asp_net_mvc_ascx.html
Copyright © 2020-2023  润新知