如何在webform的aspx应用中使用aspnet mvc2的 routemapping.docx
- 文档编号:7189583
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:10
- 大小:163.80KB
如何在webform的aspx应用中使用aspnet mvc2的 routemapping.docx
《如何在webform的aspx应用中使用aspnet mvc2的 routemapping.docx》由会员分享,可在线阅读,更多相关《如何在webform的aspx应用中使用aspnet mvc2的 routemapping.docx(10页珍藏版)》请在冰豆网上搜索。
如何在webform的aspx应用中使用aspnetmvc2的routemapping
如何混合使用aspx和mvc2的route_mapping
背景
本文是讨论如何在已有的的webform应用类型中,添加mvc2的route-mapping的处理,并给出推荐的最佳实践。
如何集成mvc2
首先,需要将mvc框架引入webform的应用路径中。
涉及到的地方有:
引入依赖的assembly;web.config文件的处理;添加RouteTable的route-mapping;添加controller;
本文以一个home的urlmapping作为实现的目标来进行讨论。
1复制依赖的文件
安装mvc2之后,可以在ProgramFile下面找到安装的mvc2的安装目录,里面有需要的System.Web.Mvc.dll文件:
在ProgramFile下的ReferenceAssemblies下的Framework\v3.5下,能找到需要的System.Web.Routing.dll和System.Web.Abstractions.dll文件:
将上面的文件复制到webapp的bin目录下,依赖的文件就复制完毕了。
2修改web.config
需要修改两处,对应IIS6和IIS7的经典模式的配置节,需要在
以及对应IIS7的集成模式的配置节,在
3修改global.asax
这部分工作是添加RouteTable的默认的Route处理,这里是假设提供的Route的Controller中包含RegisterRoute静态方法,代码如下:
4添加Route-Mapping
这部分的代码较多,直接贴代码了。
由于考虑支持.net3.5的平台,所以里面的新的匿名类、类扩展等新特性需要用传统方式改写。
为了支持RouteMap中的属性定义,我添加了一个HomeControllerInfo属性类,提供可以识别的controller、action、id属性:
classHomeControllerInfo
{
privateobject_controller;
publicobjectcontroller{
get
{
return_controller;
}
set
{
_controller=value;
}
}
privateobject_action;
publicobjectaction
{
get
{
return_action;
}
set
{
_action=value;
}
}
privateobject_id;
publicobjectid
{
get
{
return_id;
}
set
{
_id=value;
}
}
}
在HomeController的RegisterRoutes方法中,设置好HomeControllerInfo实例的默认值,然后调用RouteCollectionExtensions的MapRoute方法,做Route-Mapping:
publicstaticvoidRegisterRoutes(RouteCollectionroutes)
{
HomeControllerInfoinfo=newHomeControllerInfo();
info.controller="Home";
info.action="Index";
info.id=UrlParameter.Optional;
RouteCollectionExtensions.MapRoute(routes,
//routes.MapRoute(
"HomeMvc",//Routename
"home.mvc/{action}/{id}",//URLwithparameters
info//new{controller="Home",action="Index",id=UrlParameter.Optional}//Parameterdefaults
);
RouteCollectionExtensions.MapRoute(routes,
//routes.MapRoute(
"Home1",//Routename
"home/{action}/{id}",//URLwithparameters
info//new{controller="Home",action="Index",id=UrlParameter.Optional}//Parameterdefaults
);
RouteCollectionExtensions.MapRoute(routes,
//routes.MapRoute(
"Home2",//Routename
"home.aspx/{action}/{id}",//URLwithparameters
info//new{controller="Home",action="Index",id=UrlParameter.Optional}//Parameterdefaults
);
}
上面提供的Route-Mapping的方式有3种,我们依次列举。
Øhome/{action}/{id}的模式
第一种是mvc推荐的模式,是home/{action}/{id}的模式,IIS6下需要提供通用的处理handler,并指向aspnet_isapi.dll,过程如下:
记住需要去掉文件存在的验证,要么会导致Route-Mapping的失败。
这种方式会导致对静态文件的处理都会经过的处理,发现很容易导致不兼容的情况,对puremvc的应用是一个可以考虑的选择,对于webform与mvc的混合应用不太适合,pass掉。
Øhome.mvc/{action}/{id}的模式
这种也是微软建议的forIIS6的处理模式。
需要在IIS6中添加一个.mvc的应用程序扩展类型,然后将其处理handler指向aspnet_isapi.dll,过程如下:
记住需要去掉文件存在的验证,要么会导致Route-Mapping的失败。
这种方式会导致一定的配置工作量,不是很理想。
Øhome.aspx/{action}/{id}的模式
最好这种是直接拦截aspx的处理请求的模式,不需要配置。
因为UrlRoutingModule的处理过程优先于aspx的handler的派发,所以可以添加基于特定aspx的Route-Mapping。
这种方式需要的配置工作量极小,可以很好的和IIS6协同工作,所以是推荐的webform与mvc的混合应用模式下的Route-Mapping的首选的处理模式。
该模式的缺点是容易引起混淆,不容易在形式上区分普通的aspx请求和mvc的aspx请求,不过相比对每个IIS6的配置,这个困难是要小很多。
ØMapRoute中的url释义
以模式home.aspx/{action}/{id}为例:
其中,定义了两个变量,action和id,其中action是强制的名称,和controller中的方法名称对应(大小写不敏感)。
Id可以是任意的名称,对应action中的参数(同样大小写不敏感)。
由于url的连接点(home.aspx)是给定的,因此对应的controller也是固定的,这里通过默认值来添加。
默认值中,指定了默认的controller名称是Home,那么mvc会查找HomeController类作为http请求的处理者。
action的默认值是”index”,如果没提供action的时候会使用index作为action。
id的默认值是UrlParameter.Optional,表示这个值是可以没有。
info.controller="Home";
info.action="Index";
info.id=UrlParameter.Optional;
5添加controller的处理
我们假定的允许场景是根据请求的action和参数,返回对应的JSON对象。
这样,我们在HomeController的Index方法中,返回一个JsonResult就可以了,在Controller的基类方法Json中对此进行了封装,直接调用就可以。
需要注意两点:
1、参数id需要是可空类型;
2、返回的JsonResult需要指定JsonRequestBehavior.AllowGet,否则不能在Get请求中返回JSON数据;
[HandleError]
publicclassHomeController:
Controller
{
publicActionResultIndex(int?
id)
{
stringresult="HomeController.Index(int?
id),id:
";
if(id.HasValue)
{
result+=id.Value.ToString();
}
else
{
result+="null";
}
returnthis.Json(result,JsonRequestBehavior.AllowGet);
}
publicActionResultAbout()
{
returnthis.Json("WelcometoASP.NETMVC!
",JsonRequestBehavior.AllowGet);
}
总结
经验证,在传统的webform应用类型中,提供mvc2的route-mapping是可行的,建议通过拦截aspx的处理来添加route-mapping的处理模式。
建议在每个controller中,提供一个RegisterRoutes的静态共有方法,用来登记自己的routes。
在此基础之上,提供route-mapping的配置文件,用来加载和初始化RouteTable中的routes。
附件
上面涉及的相关配置文件和源代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何在webform的aspx应用中使用aspnet mvc2的 routemapping 如何 webform aspx 应用 使用 aspnet mvc2