[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

黄舟
Freigeben: 2016-12-30 14:35:24
Original
1537 Leute haben es durchsucht

[ASP.NET
MVC Mavericks Road] 08 – Bereichsverwendung

ASP.NET MVC ermöglicht die Verwendung von Bereich (Bereich) zum Organisieren von Webanwendungen. Jeder Bereich repräsentiert einen anderen Aspekt der Anwendung . Funktionsmodul. Dies ist für große Projekte sehr nützlich, da jedes Funktionsmodul über einen eigenen Ordner mit eigenem Controller, eigener Ansicht und eigenem Modell verfügen kann, es erhöht jedoch auch den Verwaltungsaufwand.

Verzeichnis dieses Artikels


Bereich erstellen

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie „Hinzufügen->Bereich“, um das folgende Dialogfeld anzuzeigen Zum Ausfüllen wird der Bereich angezeigt:

[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

Nach dem Klicken auf „Hinzufügen“ sieht die Projektverzeichnisstruktur wie folgt aus:

[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

Ähnlich wie beim Erstellen einer leeren MVC-Projektstruktur verfügt der Admin-Bereich über eigene Ordner „Controller“, „Modelle“ und „Ansichten“. Der Unterschied besteht darin, dass es eine zusätzliche Datei „AdminAreaRegistration.cs“ gibt. Diese Datei definiert eine Klasse namens „AdminAreaRegistration“. 🎜>

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 }
            );
        }
    }
}
Nach dem Login kopieren
Das System generiert automatisch die AdminAreaRegistration-Klasse, die von der abstrakten Klasse AreaRegistration erbt und die

AreaName-Eigenschaft und die RegisterArea-Methode überschreibt. In der RegisterArea-Methode wird eine Standardroute für uns definiert. In dieser Methode können wir auch andere Routen definieren, die speziell für den Admin-Bereich gelten. Beachten Sie jedoch Folgendes: Wenn Sie die Route hier benennen möchten, achten Sie darauf, dass sie sich von der gesamten Anwendung unterscheidet.


Die MapRoute-Methode der AreaRegistrationContext-Klasse wird genauso verwendet wie die MapRoute-Methode der RouteCollection-Klasse, mit der Ausnahme, dass die AreaRegistrationContext-Klasse die registrierten Routen darauf beschränkt, nur mit dem Controller des aktuellen Bereichs übereinzustimmen. Wenn Sie also die hinzufügen Der Standard-Namespace des Controllers wurde geändert und das Routing-System kann diesen Controller nicht finden. Die

RegisterArea-Methode erfordert keinen manuellen Aufruf. Die Application_Start-Methode in Global.asax verfügt bereits über den folgenden Code, um dies für uns zu tun:

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Nach dem Login kopieren
Call AreaRegistration Mit der Methode kann die MVC-Anwendung nach dem Start alle Klassen finden, die von AreaRegistration erben, und für jede dieser Klassen ihre RegisterArea-Methode aufrufen.


Hinweis: Ändern Sie die Reihenfolge der Registrierungsmethoden in Application_Start nicht einfach. Wenn Sie die RouteConfig.RegisterRoutes-Methode vor die AreaRegistration.RegisterAllAreas-Methode setzen, erfolgt die Registrierung der Bereichsrouten nach der Routenregistrierung ist in Ordnung, daher wird der Controller dazu führen, dass der Bereich mit der falschen Route übereinstimmt.

Bereichsoperation

Das Hinzufügen von Controller, Ansicht und Modell im Bereich ist dasselbe wie das allgemeine Hinzufügen. Hier fügen wir einen Controller namens Home im Admin-Bereich hinzu, der Code lautet wie folgt:

public class HomeController : Controller {
        
    public ActionResult Index() {
        return View();
    }
}
Nach dem Login kopieren
Dann fügen wir eine Ansicht für den Index Acton hinzu, der Code lautet wie folgt:

@{ 
    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>
Nach dem Login kopieren

Führen Sie die Anwendung aus und suchen Sie dann die URL zu /Admin/Home/Index. Das Ergebnis ist:

[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

Bisher haben wir gesehen, dass der Workflow in Area tatsächlich derselbe ist wie der Prozess im Root-Verzeichnis. Aber Area ist kein völlig unabhängiger Arbeitsbereich, schauen wir uns das unten an.

Controller-Mehrdeutigkeitsproblem

Stellen Sie sich vor, wir fügen jetzt einen Controller mit dem Namen Home zum Controller-Ordner im Stammverzeichnis hinzu, dann positionieren wir die URL auf / Home/Index, kann das Routing-System mit dem Controller im Stammverzeichnis übereinstimmen?


Nachdem Sie den HomeController im Ordner „Controller“ im Stammverzeichnis hinzugefügt haben, fügen Sie eine Ansicht für den Index hinzu. Der Inhalt ist beliebig:

...
<body>
    <p>
        <h2>Root Index</h2>
    </p>
</body>
...
Nach dem Login kopieren
Die Route wird nicht geändert System definiert in der Datei 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 }
    );
}
Nach dem Login kopieren
Führen Sie das Programm aus und suchen Sie die URL zu /Home/Index. Als Ergebnis sehen wir die folgende Fehlermeldung:

[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

出现这个问题是因为路由系统进行匹配的时候出现了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" }
    );
}
Nach dem Login kopieren

运行程序,如下结果说明解决了同名歧义问题:

[ASP.NET MVC Mavericks Road] 08 – Flächennutzung

添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。

生成Area URL链接

关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。

如果要在Area中生成当前Area的URL链接,直接用下面的方法就行:

@Html.ActionLink("Click me", "About")
Nach dem Login kopieren

它根据当前所在的Area和Controller会生成如下Html代码:

<a href="/Admin/Home/About">Click me</a>
Nach dem Login kopieren


如果要生成其他Area的URL链接,则需要在Html.ActionLink方法的匿名参数中使用一个名为area的变量来指定要生成链接的Area名称,如下:

@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })
Nach dem Login kopieren

它会根据被指定的Area去找路由的定义,假定在Support Area中定义了对应的路由,那么它会生成如下链接:

<a href="/Support/Home/Index">Click me to go to another area</a>
Nach dem Login kopieren


如果要在当前Area生成指根目录某个controller的链接,那么只要把area变量置成空字符串就行,如下:

@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" })
Nach dem Login kopieren

它会生成如下Html链接:
<a href="/Home/Index">Click me to go to top-level part</a>
Nach dem Login kopieren

 以上就是[ASP.NET MVC 小牛之路]08 - Area 使用的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage