上一主题下一主题
«12345»Pages: 1/10     Go
关键字
主题 : 实例快速上手 - ASP.NET MVC4中的Area使用场景与注意事项
级别: VIP四级

UID: 230365
精华: 12
发帖: 314
威望: 3432 点
学点: 380 点
贡献: 2 点
好评: 1 点
学币: 0 个
注册时间: 2010-04-16
最后登录: 2014-09-25
楼主  发表于: 2014-07-23 16:49||

1 实例快速上手 - ASP.NET MVC4中的Area使用场景与注意事项

管理提醒: 本帖被 beifengfwy 执行加亮操作(2014-07-23)
d@pD5n=m;  
L m"a3 Nb  
Q&^ti)vB  
+mE y7qM  
目录 %7pT\8E5  
&%L1n?>Q}  
前言 "n:z("Q*  
创建Area z '3  
Area的运行 )nJs9}( 0  
Controller的歧义问题 `gfh]7T  
生成Area URL链接 I0sd%'Ht?  
C4&yC81Gm  
内容 3|-)]^1O  
f"q='B9_T\  
前言 }Zc.rk  
p]:5S_$  
ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块。这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Controller、View和Model,但对于管理也增加了一定的难度。 TB\#frG  
创建Area bEyZRG  
右键工程选择 添加->区域,弹出如下填写Area的对话框: <5rp$AzT  
TZTi:\nS  
点击添加后,工程目录结构如下: Hly2{hokq  
w,> ceu/  
和创建一个空MVC工程结构类似,Admin Area 有自己的 Controllers、Models 和 Views 文件夹,不一样的地方就是多了一个 AdminAreaRegistration.cs 文件,这个文件中定义了一个叫 AdminAreaRegistration 的类,它的内容如下: ,<0R'R  
namespace MvcApplication1.Areas.Admin { URdCV{@42  
    public class AdminAreaRegistration : AreaRegistration { FM$XMD0=  
        public override string AreaName { WM$}1:O  
            get { p;zV4uSv  
                return "Admin"; S\b[Bq  
            } YAQ]2<H  
        } {fFZ%$  
0Am&:kX't  
        public override void RegisterArea(AreaRegistrationContext context) { T'B43Q  
            context.MapRoute( N^z4I,GV(  
                "Admin_default", :_V9Jwu  
                "Admin/{controller}/{action}/{id}", jL o(Uf  
                new { action = "Index", id = UrlParameter.Optional } 6U~AKq"+f  
            ); uNSaw['0j  
        } W|h~&O  
    } 2-=Ov@y2k!  
} nX%b@cOXj  
系统自动生成的 AdminAreaRegistration 类继承至抽象类 AreaRegistration,并重写了 AreaName 属性和 RegisterArea 方法。在 RegisterArea 方法中它为我们定义了一个默认路由,我们也可在这个方法中定义专属于Admin Area的的其他路由。但有一点要注意,在这如果要给路由起名字,一定要确保它和整个应用程序不一样。 n'*4zxAA  
AreaRegistrationContext 类的 MapRoute 方法和 RouteCollection 类的 MapRoute 方法的使用是一样的,只是 AreaRegistrationContext 类限制了****的路由只会去匹配当前 Area 的 controller,所以,如果你把在 Area 中添加的 controller 的默认命名空间改了,路由系统将找不到这个controller 。 P t< JF  
RegisterArea 方法不需要我们手动去调用,在 Global.asax 中的 Application_Start 方法已经有下面这样一句代码为我们****好了这件事: 4A0 ,N8ja}  
"i>?Tg^  
调用 AreaRegistration.RegisterAllAreas 方法让MVC应用程序在启动后会寻找所有继承自 AreaRegistration 的类,并为每个这样的类调用它们的 RegisterArea 方法。 `R[cM; c2  
注意:不要轻易改变 Application_Start 中****方法的顺序,如果你把RouteConfig.RegisterRoutes方法放到AreaRegistration.RegisterAllAreas方法之前,Area 路由的****将会在路由****之后,路由系统是按顺序来匹配的,所以这样****会让请求 Area 的 Controller 匹配到错误的路由。 `|kW%L4  
Area的运行 tSibz l~  
在Area中添加controller、view和model和一般的添加是一样的。在这,我们在Admin Area中添加一个名为 Home 的controller,代码如下: p1t qwV  
public class HomeController : Controller { y buKwZFC  
         K(jo[S  
    public ActionResult Index() { 3Ye{a<ckK  
        return View(); RZMR2fP%  
    } *G rYB6MT  
} ,X`w/ 2O  
然后我们再为Index Acton添加一个View,代码如下: 6_mkt|E=  
@{ tuK2D,6  
    ViewBag.Title = "Index"; N !~O~ Eo3  
    Layout = null; Nyx)&T&I  
} 4og/y0n,l"  
<!DOCTYPE html> d#8 n<NM  
'G>$W+lT^  
<html> sP:nTpTsC  
<head> /SW*y@R2l  
    <meta name="viewport" content="width=device-width" /> %T6 sm  
    <title>Index</title> 9%Eo<+my h  
</head> J?C#'2 /   
<body> r'(*#  
    <div> vSnGPLl  
        <h2>Admin Area Index</h2> Q Yg V[\&  
    </div> ;Zm-B]\  
</body> fc&djd`FuX  
</html> ?}e^-//*i  
运行应用程序,然后将URL定位到/Admin/Home/Index,下面是运行结果: Xp+lpVcJ  
N7u|< 0[  
到这,我们已经看到,Area中的的工作流程其实就是和根目录下的流程是一样的。但Area并不是一个完全独立的工作空间,我们下面来看看。 XL[Dmu&  
Controller的歧义问题 b>2{F6F  
试想一下,如果我们现在在根目录的 Controller 文件夹中也添加一个名为 Home 的 Controller,然后我们通过把URL定位到 /Home/Index,路由系统能匹配到根目录下的 Controller 吗? I&U.5wf  
在根目录的 Controllers 文件夹中添加好 HomeController 后,为Index添加View,内容随意: \E=MV~:R  
<body> R<B5<!+  
    <div> O DEFs?%'  
        <h2>Root Index</h2> k Nvb>v  
    </div> 7B<,nKd  
</body> d#OAM;0}5  
路由不改动,我们使用 RouteConfig.cs 文件中系统定义的默认路由: G6.lRaPu"m  
public static void RegisterRoutes(RouteCollection routes) { g >@a  
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); &) 64:l&  
3G[|4v?[<_  
    routes.MapRoute( -g."{ |  
        name: "Default", nE +H)%p  
        url: "{controller}/{action}/{id}", k'_f?_PBu  
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } :%z#s  
    ); Oi'y0S~ g  
} )Q62I\  
运行程序,将URL定位到 /Home/Index。结果我们会看到如下错误信息: 8k3y"239t  
`#' j3,\6  
出现这个问题是因为路由系统进行匹配的时候出现了Controller同名的歧义。 2{.g7bO  
当Area被****的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制。 Z;V(YK(WO.  
为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下: v)T# iw[  
%W8iC%~  
运行程序,如下结果说明解决了同名歧义问题: 8h0 CG]  
HAL\j 5i  
添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。 78{9@\e"0  
"AZ|u #0P  
生成Area URL链接 G^tazAEfo  
关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。 1I`F?MT  
如果要在Area中生成当前Area的URL链接,直接用下面的方法就行: m5iCvOP  
@Html.ActionLink("Click me", "About") {f\wIZ-K A  
它根据当前所在的Area和Controller会生成如下Html代码: .Sn{a }XP4  
<a href="/Admin/Home/About">Click me</a> $cIaLq  
如果要生成其他Area的URL链接,则需要在Html.ActionLink方法的匿名参数中使用一个名为area的变量来指定要生成链接的Area名称,如下: G"` }"T0}  
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" }) ~CT]&({  
它会根据被指定的Area去找路由的定义,假定在Support Area中定义了对应的路由,那么它会生成如下链接: w$/lq~zU  
<a href="/Support/Home/Index">Click me to go to another area</a> =]]1x_GB  
如果要在当前Area生成指根目录某个controller的链接,那么只要把area变量置成空字符串就行,如下: l99Lxgx=  
@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" }) |,p"<a!+{w  
它会生成如下Html链接: Ij7P-5=<  
<a href="/Home/Index">Click me to go to top-level part</a> cFw-JM<  
EP#2it]0]  
注:此课程系 我本人的大型商业课程《基于ASP.NET MVC 4 +Knockout.JS+Web API+FluentData+EasyUI 技术实现Web通用商业****发框架》中 项目预备知识部分的 #<< el;n  
课程四《ASP.NET MV**** 核心技术教程》中的《专题三、实例快速上手 - ASP.NET MV**** URL Routing 深入与使用URL最佳实践》 g%l ,a3"  
整套课程预计7月份内上线预****,敬请关注北风官网! wYf\!]}'  
]CF-#q}'  
链接: http://pan.baidu.com/s/1c0pKnWs F<k+>e  
密码:
本部分内容设定了隐藏,需要回复后才能看到
z^U+ oG  
9^W7i]-Z  
##6\~!P  
m;~}}~&vQ  
级别: VIP四级

UID: 332925
精华: 0
发帖: 4
威望: 22 点
学点: 8 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2011-12-08
最后登录: 2016-05-21
沙发(1楼)  发表于: 2014-08-12 12:31||

回 楼主(beifengfwy) 的帖子

顶起来
级别: 北风爱好者

UID: 468905
精华: 0
发帖: 6
威望: 9 点
学点: 14 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2014-06-15
最后登录: 2014-11-19
板凳(2楼)  发表于: 2014-09-10 15:03||

回 楼主(beifengfwy) 的帖子

<h1>谢谢楼主<h1>
级别: 北风爱好者

UID: 468905
精华: 0
发帖: 6
威望: 9 点
学点: 14 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2014-06-15
最后登录: 2014-11-19
地板(3楼)  发表于: 2014-09-10 15:03||

<h1>谢谢楼主</h1>
级别: 北风工程师

UID: 470673
精华: 0
发帖: 3
威望: 2297 点
学点: 2316 点
贡献: 251 点
好评: 0 点
学币: 19 个
注册时间: 2014-06-29
最后登录: 2015-06-06
地下室(4楼)  发表于: 2014-09-13 10:00||

好样的
级别: 北风助理工程师

UID: 283464
精华: 0
发帖: 37
威望: 317 点
学点: 36 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2011-01-27
最后登录: 2014-11-04
下水道(5楼)  发表于: 2014-09-16 15:39||

回 楼主(beifengfwy) 的帖子

看看,学习一下。
级别: VIP五级

UID: 432077
精华: 0
发帖: 8
威望: 64 点
学点: 10 点
贡献: 1 点
好评: 0 点
学币: 0 个
注册时间: 2013-07-26
最后登录: 2016-09-12
6楼  发表于: 2014-09-21 09:05||

应该有学习价值的参考资料
级别: 北风爱好者

UID: 503654
精华: 0
发帖: 2
威望: 5 点
学点: 0 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2014-09-25
最后登录: 2014-09-25
7楼  发表于: 2014-09-25 00:05||

真是无私啊
级别: 北风爱好者

UID: 504775
精华: 0
发帖: 1
威望: 1 点
学点: 3 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2014-09-27
最后登录: 2014-09-27
8楼  发表于: 2014-09-27 16:45||

觉得肯定有帮助
级别: VIP四级

UID: 389966
精华: 0
发帖: 13
威望: 103 点
学点: 21 点
贡献: 0 点
好评: 0 点
学币: 0 个
注册时间: 2012-10-23
最后登录: 2016-11-17
9楼  发表于: 2014-10-10 09:34||

谢谢分享!!
上一主题下一主题
«12345»Pages: 1/10     Go