[ASP.NET
MVC Mavericks Road] 08 - Zone utilisant
ASP.NET MVC permet d'utiliser Area (zone) pour organiser des applications Web. Chaque zone représente un aspect différent de l'application. .Module fonctionnel. Ceci est très utile pour les grands projets. Area permet à chaque module fonctionnel d'avoir son propre dossier avec son propre contrôleur, vue et modèle, mais cela ajoute également un certain degré de difficulté à la gestion.
Répertoire de cet article
Créer une zone
Cliquez avec le bouton droit sur le projet et sélectionnez Ajouter->Zone, la boîte de dialogue suivante pour remplir la zone apparaîtra :
Après avoir cliqué sur Ajouter, la structure du répertoire du projet est la suivante :
Semblable à la création d'une structure de projet MVC vide, la zone d'administration possède ses propres dossiers Contrôleurs, Modèles et Vues, la différence est qu'il existe un fichier AdminAreaRegistration.cs supplémentaire. Ce fichier définit une classe appelée AdminAreaRegistration. Son contenu est le suivant : <.>
namespace MvcApplication1.Areas.Admin { public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } } }
La méthode MapRoute de la classe AreaRegistrationContext est utilisée de la même manière que la méthode MapRoute de la classe RouteCollection, sauf que la classe AreaRegistrationContext limite les routes enregistrées pour qu'elles correspondent uniquement au contrôleur de la zone actuelle, donc si vous ajoutez le L'espace de noms par défaut du contrôleur a été modifié et le système de routage ne pourra pas trouver ce contrôleur. La méthode
RegisterArea ne nous oblige pas à l'appeler manuellement. La méthode Application_Start dans Global.asax a déjà le code suivant pour le faire pour nous :
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
Remarque : ne modifiez pas facilement l'ordre des méthodes d'enregistrement dans Application_Start. Si vous placez la méthode RouteConfig.RegisterRoutes avant la méthode AreaRegistration.RegisterAllAreas, l'enregistrement des routes Area se fera après l'enregistrement de la route. est en ordre, cela entraînera le contrôleur qui demandera à la zone de correspondre au mauvais itinéraire.
Opération de zone
public class HomeController : Controller { public ActionResult Index() { return View(); } }
@{ ViewBag.Title = "Index"; Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <p> <h2>Admin Area Index</h2> </p> </body> </html>
Exécutez l'application, puis localisez l'URL vers /Admin/Home/Index. Voici le résultat :
<. 🎜>
Jusqu'à présent, nous avons vu que le flux de travail dans Area est en fait le même que le processus dans le répertoire racine. Mais Area n’est pas un espace de travail complètement indépendant, jetons un coup d’œil ci-dessous.
Imaginez si nous ajoutons maintenant un contrôleur nommé Home au dossier Controller dans le répertoire racine, alors nous positionnons l'URL vers / Accueil/Index, le système de routage peut-il correspondre au contrôleur dans le répertoire racine ?
Après avoir ajouté le HomeController dans le dossier Controllers du répertoire racine, ajoutez une vue pour l'index. Le contenu est arbitraire :
... <body> <p> <h2>Root Index</h2> </p> </body> ...
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
出现这个问题是因为路由系统进行匹配的时候出现了Controller同名的歧义。
当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制。
为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "MvcApplication1.Controllers" } ); }
运行程序,如下结果说明解决了同名歧义问题:
添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。
生成Area URL链接
关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。
如果要在Area中生成当前Area的URL链接,直接用下面的方法就行:
@Html.ActionLink("Click me", "About")
它根据当前所在的Area和Controller会生成如下Html代码:
<a href="/Admin/Home/About">Click me</a>
如果要生成其他Area的URL链接,则需要在Html.ActionLink方法的匿名参数中使用一个名为area的变量来指定要生成链接的Area名称,如下:
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })
它会根据被指定的Area去找路由的定义,假定在Support Area中定义了对应的路由,那么它会生成如下链接:
<a href="/Support/Home/Index">Click me to go to another area</a>
以上就是[ASP.NET MVC 小牛之路]08 - Area 使用的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!
如果要在当前Area生成指根目录某个controller的链接,那么只要把area变量置成空字符串就行,如下:@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" })
它会生成如下Html链接:<a href="/Home/Index">Click me to go to top-level part</a>