代码改变世界

ASP.NET 直接访问用户控件

2012-09-26 00:07  兜兜里没有药  阅读(321)  评论(2编辑  收藏  举报

这个功能主要是为了解决常规的AJAX更新数据时对HTML代码的拼接,大力解决了AJAX开发的复杂性,维护性;个人觉得还是一个不错的解决方案!

首先要实现客户端对用户控件的直接访问,需在Web.config进行如下配置:

<system.webServer>
    <handlers>
      <add name="ControlLoadHandler" path="*.ascx" type="Crazy.CRM.ContorlLoadHandler" verb="*"/>  //当碰到.ascx后缀的请求时,让其交于一般处理程序ControlLoadHandler处理
    </handlers>
    <security>
      <requestFiltering>
        <fileExtensions allowUnlisted="true">
          <remove fileExtension=".ascx"/>  //移除IIS对.ascx后缀的访问限制,如果较低版本的IIS可能不需要。
        </fileExtensions>
      </requestFiltering>
    </security>
  </system.webServer>

此时当我们发生一个ajax路径为“~/Test.ascx”时就将交于ControlLoadHandler处理。

ControlLoadHandler代码如下:

View Code
 1 using System;
 2 using System.Web;
 3 using System.Web.UI;
 4 using System.IO;
 5 using System.Text;
 6 
 7 namespace Crazy.CRM
 8 {
 9     /// <summary>
10     /// 客户端访问用户控件.ascx处理类
11     /// </summary>
12     public class ContorlLoadHandler : IHttpHandler
13     {
14 
15         public void ProcessRequest(HttpContext context)
16         {
17             //获取请求的相对路径"~/text.ascx",这里将不会得到URL参数
18             string controlPath = context.Request.AppRelativeCurrentExecutionFilePath;
19 
20             //加载请求的用户控件,并添加到实例的页面中
21             Page page = new Page();
22             Control control = page.LoadControl(controlPath);
23             page.Controls.Add(control);
24 
25             //获取用户控件最终解析后的代码
26             StringWriter controlHtml = new StringWriter();
27             context.Server.Execute(page, controlHtml, false);  //在我认识中只有使用Server.Execute方法才能引发控件的生命周期事件,如Load
28 
29             //响应请求,输出代码
30             context.Response.Write(controlHtml.ToString());
31         }
32 
33         public bool IsReusable
34         {
35             get
36             {
37                 return false;
38             }
39         }
40     }
41 }

此时这个功能已经做好了,很简单吧!

我们可以写个测试:

<a href="Test.ascx">测试访问用户控件</a>

大家可以试试哦!这个功能目前只是简单的访问,还未进行其他的处理,如果大家有兴趣或者有更好的方法不妨拿出来分享下哦~~