ASP.NET MVC中加载WebForms用户控件(.ascx)
2012-05-03 12:30
411 查看
问题背景
博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为“上一月”、“下一月”的链接生成"__doPostBack()"的js调用,如下图:
![](http://pic002.cnblogs.com/images/2012/1/2012050311452677.png)
目前发现它会带来两个问题:
1. 不支持IE10;
2. 某些电脑不允许执行__doPostBack。
问题提炼
前提:
我们想以最低的成本解决这个问题,也就是对当前代码尽可能少的改动。所以要尽可能重用现有的日历控件代码。
日历改为Ajax加载,点击“上一月”、“下一月”时Ajax更新日历内容。
用ASP.NET MVC处理Ajax请求。
要解决的问题:
如何在ASP.NET MVC Controller中加载包含WebForms日历控件的用户控件(.ascx),并得到其输出的字符串,然后将__doPostBack的代码替换为ajax调用代码。
核心问题:
如何在ASP.NET MVC Controller中得到用户控件(.ascx)输出的字符串。
解决方法
先看代码
代码很简单,但得到这个代码花了今天一上午时间。
代码说明:
必须要new Page(),只有Page才能LoadControl。
必须要new HtmlForm(),因为日历控件必要要放在<form runat="server">之间。
关键功臣是HttpContext.Current.Server.Execute,动态加载控件并输出字符串全靠它。这个功臣是在这篇文章中找到的(感谢Sam Mueller)。之前我用过的方法(继续不走寻常路:ASP.NET MVC中使用Web Forms用户控件)不仅麻烦,而且在这个场景下会有问题。
代码运行结果:
![](http://pic002.cnblogs.com/images/2012/1/2012050312225569.png)
完整代码下载:
http://files.cnblogs.com/dudu/CNBlogsDemoMvcAscx.rar
博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为“上一月”、“下一月”的链接生成"__doPostBack()"的js调用,如下图:
![](http://pic002.cnblogs.com/images/2012/1/2012050311452677.png)
目前发现它会带来两个问题:
1. 不支持IE10;
2. 某些电脑不允许执行__doPostBack。
问题提炼
前提:
我们想以最低的成本解决这个问题,也就是对当前代码尽可能少的改动。所以要尽可能重用现有的日历控件代码。
日历改为Ajax加载,点击“上一月”、“下一月”时Ajax更新日历内容。
用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用户控件)不仅麻烦,而且在这个场景下会有问题。
代码运行结果:
![](http://pic002.cnblogs.com/images/2012/1/2012050312225569.png)
完整代码下载:
http://files.cnblogs.com/dudu/CNBlogsDemoMvcAscx.rar
相关文章推荐
- ASP.NET MVC中加载WebForms用户控件(.ascx)
- ASP.NET MVC加载ASCX后并获取其内控件值或赋值
- ASP.NET MVC加载用户控件后并获取其内控件值或赋值
- 在ASP.NET MVC中如何让ASCX用户控件具有Action / Controller
- asp.net动态加载ascx用户控件
- 【转载】asp.net动态加载ascx用户控件
- asp.net 动态加载用户控件注意
- Asp.net 2.0 动态加载其他子目录用户控件问题
- 关于Asp.net 页面动态加载用户控件,出现“未能加载视图状态”的原因
- ASP.NET给用户控件(.ascx)增加属性
- ASP.NET MVC加载ASCX之后,并为之赋值
- [ASP.NET]asp.net动态加载用户控件
- FineUIPro/Mvc/Core/JS v4.2.0 发布了(老牌ASP.NET控件库,WebForms,ASP.NET MVC,Core,JavaScript)!
- asp.net 将ascx用户控件打包成dll
- ASP.NET 页面:在此页面动态调用用户控件(.ASCX)
- ASP.NET动态加载用户控件的页面生成过程
- Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]
- ASP.net中动态加载用户控件
- Asp.net 2.0 动态加载其他子目录用户控件问题
- asp.net mvc下使用Html.Partial嵌套页面(功能同等用户控件)