不走寻常路:在WebForm中使用MVC

问题场景:

在改进博客园博客后台的过程中,有一个页面我们想用ASP.NET MVC来写。但我们不想通过设置<modules runAllManagedModulesForAllRequests="true"/>使用System.Web.Routing来处理请求,因为不能确定这是否会与我们现有的URL重写产生冲突。我们只是想用Razor爽一下。

解决思路:

不改变ASP.NET管线的请求处理流程,请求还是正常到达一个.aspx页面,然后再转手给ASP.NET MVC。也就是把WebForm作为一个中转站。

好处:

在现有项目中,以最小的代价用上ASP.NET MVC。先品尝一下Razor的美味。

解决方法:

用System.Web.Mvc.MvcHandler可以轻松搞定,请看下面Home.aspx的代码:

复制代码
<%@ Page Language="C#" AutoEventWireup="true" %>
<script runat="server">
protected override void OnInit(EventArgs e)
{
System.Web.Routing.RequestContext requestContext
= new System.Web.Routing.RequestContext();
requestContext.HttpContext
= new HttpContextWrapper(Context);
requestContext.RouteData
= new System.Web.Routing.RouteData();
requestContext.RouteData.Values.Add(
"controller", "Home");
requestContext.RouteData.Values.Add(
"action", "Index");
IHttpHandler handler
= new System.Web.Mvc.MvcHandler(requestContext);
handler.ProcessRequest(Context);
}
</script>
复制代码

运行结果:

项目结构:

看,没有Global.asax。

演示代码下载:

CnblogsMvcDemo0305.rar

更新:

不走寻常路,是为了找到正确的路,感谢老赵指出了正确的路:

在Global.asax.cs的Application_Start中使用下面的代码:

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Test.aspx",
"Test.aspx",
new { controller = "Test", action = "Index" }
);

posted @   dudu  阅读(4617)  评论(18编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
历史上的今天:
2007-03-05 Outlook 2007的一个小问题
2007-03-05 IBM ThindPad X31安装Vista
2005-03-05 小改动
2005-03-05 今天买了本《软件设计的艺术》
2004-03-05 VS.NET的新用途
2004-03-05 增加了查看最新回复功能
2004-03-05 首页文章字数统计改进
点击右上角即可分享
微信分享提示