[ASP.NET MVC Mavericks Road] 08 - 영역 사용

黄舟
풀어 주다: 2016-12-30 14:35:24
원래의
1538명이 탐색했습니다.

[ASP.NET
MVC Mavericks Road] 08 - Area 사용

ASP.NET MVC에서는 Area(영역)를 사용하여 웹 애플리케이션을 구성할 수 있습니다. . 기능 모듈. 이는 대규모 프로젝트에 매우 유용합니다. Area를 사용하면 각 기능 모듈에 자체 컨트롤러, 보기 및 모델이 포함된 자체 폴더가 있지만 관리가 어느 정도 어려워집니다.

이 글의 디렉토리


영역 만들기

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가->영역을 선택하면 다음 대화 상자가 나타납니다. 영역을 채우려면 다음 팝업이 표시됩니다.

[ASP.NET MVC Mavericks Road] 08 - 영역 사용

추가를 클릭하면 프로젝트 디렉토리 구조는 다음과 같습니다.

[ASP.NET MVC Mavericks Road] 08 - 영역 사용

빈 MVC 프로젝트 구조를 만드는 것과 유사하게 관리 영역에는 자체 Controllers, Models 및 Views 폴더가 있지만 차이점은 추가 AdminAreaRegistration.cs 파일이 있다는 것입니다. 이 파일의 내용은 다음과 같습니다. 🎜>

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 }
            );
        }
    }
}
로그인 후 복사
시스템은 AreaRegistration 추상 클래스에서 상속되는 AdminAreaRegistration 클래스를 자동으로 생성하고

AreaName 속성 및 RegisterArea 메서드를 재정의합니다. RegisterArea 메소드에서는 기본 경로를 정의하며 이 메소드에서는 관리 영역과 관련된 다른 경로를 정의할 수도 있습니다. 하지만 한 가지 주의할 점은 여기서 경로 이름을 지정하려면 전체 애플리케이션과 다른지 확인해야 한다는 것입니다.


AreaRegistrationContext 클래스의 MapRoute 메서드는 RouteCollection 클래스의 MapRoute 메서드와 동일하게 사용됩니다. 단, AreaRegistrationContext 클래스는 등록된 경로를 현재 Area의 컨트롤러에만 일치하도록 제한하므로 컨트롤러의 기본 네임스페이스가 변경되었으며 라우팅 시스템이 이 컨트롤러를 찾을 수 없습니다.

RegisterArea 메서드에서는 이를 수동으로 호출할 필요가 없습니다. Global.asax의 Application_Start 메서드에는 이미 이 작업을 수행하는 다음 코드가 있습니다.

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

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
로그인 후 복사
RegisterAllAreas를 호출하세요. 메서드를 사용하면 MVC 애플리케이션이 시작 후 AreaRegistration에서 상속되는 모든 클래스를 찾고 이러한 각 클래스에 대해 RegisterArea 메서드를 호출하게 됩니다.


참고: Application_Start에서 등록 방법 순서를 쉽게 변경하지 마세요. RouteConfig.RegisterRoutes 메서드를 AreaRegistration.RegisterAllAreas 메서드 앞에 두면 경로 등록 이후에 Area 경로가 등록됩니다. 일치하는 순서이므로 컨트롤러가 영역을 잘못된 경로와 일치하도록 요청하게 됩니다.

Area 작업

Area에 컨트롤러, 뷰, 모델을 추가하는 방법은 일반 추가와 동일합니다. 여기서는 관리 영역에 Home이라는 컨트롤러를 추가합니다. 코드는 다음과 같습니다.

public class HomeController : Controller {
        
    public ActionResult Index() {
        return View();
    }
}
로그인 후 복사
그런 다음 Index Acton에 대한 보기를 추가합니다. 코드는 다음과 같습니다.

@{ 
    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>
로그인 후 복사

응용 프로그램을 실행한 후 /Admin/Home/Index에 대한 URL을 찾으세요. 결과는 다음과 같습니다.

[ASP.NET MVC Mavericks Road] 08 - 영역 사용

지금까지 Area의 워크플로가 실제로 루트 디렉터리의 프로세스와 동일하다는 것을 확인했습니다. 하지만 Area는 완전히 독립적인 작업 공간이 아니므로 아래에서 살펴보겠습니다.

컨트롤러 모호성 문제

이제 루트 디렉터리의 Controller 폴더에 Home이라는 컨트롤러를 추가한다고 상상해 보세요. URL을 /에 배치합니다. Home/색인, 라우팅 시스템이 루트 디렉터리의 컨트롤러와 일치할 수 있나요?


루트 디렉터리의 Controllers 폴더에 HomeController를 추가한 후 인덱스에 대한 보기를 추가합니다. 콘텐츠는 임의적입니다.

...
<body>
    <p>
        <h2>Root Index</h2>
    </p>
</body>
...
로그인 후 복사
경로는 변경되지 않습니다. 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 }
    );
}
로그인 후 복사
프로그램을 실행하고 /Home/Index에 대한 URL을 찾습니다. 결과적으로 다음과 같은 오류 메시지가 표시됩니다.

[ASP.NET MVC Mavericks Road] 08 - 영역 사용

出现这个问题是因为路由系统进行匹配的时候出现了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" }
    );
}
로그인 후 복사

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

[ASP.NET MVC Mavericks Road] 08 - 영역 사용

添加了 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>
로그인 후 복사


如果要在当前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>
로그인 후 복사

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


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿