• 使用区域


    新建一个MVC项目,取名叫11-4WorkingWithAreas,项目模板选择Internet Application。

    1、创建区域

    在解决方案管理器中鼠标右击该项目->add->area。

    出现对话框,输入要新加的区域名字,这里取名为Admin。

    添加后,项目中会新增一个Areas顶级文件夹,其中包含了一个名为Admin的文件夹。

    每个象Admin这样的文件夹就是一个区域,里面包含了Controllers、Models、Views文件夹,还包含了一个以该区域名Admin打头的AdminAreaRegistration.cs的文件,这个文件中定义了在本区域内的路由匹配模式:

    namespace _11_4WorkingWithAreas.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 }
                );
            }
        }
    }

    2、区域内实例

    在Admin区域内,添加控制器HomeController:

    namespace _11_4WorkingWithAreas.Areas.Admin.Controllers
    {
        public class HomeController : Controller
        {
            //
            // GET: /Admin/Home/
    
            public ActionResult Index()
            {
                return View();
            }
    
        }
    }

    在Index动作方法上鼠标右击,添加默认视图Index.cshtml。路径为/Areas/Admin/Views/Home/Index.cshtml.

    这样,客户端可以通过"~/Admin/Home/Index"访问到这个页面。

    需要注意的是,如果这个时候直接访问"~/",也就是"~/Home/Index"会出现错误。

    有两个HomeController会发生名字冲突。

    所以,对于区域来说,并不会隔绝路由名字或者控制器名字,都是在整个解决方案中有效的。

    解决这个冲突的方法跟前面一样,在主项目的Global.asax中路由定义里面,添加一个匿名类型new[] { "_11_4WorkingWithAreas.Controllers" }如下:

    namespace _11_4WorkingWithAreas

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                    new[] { "_11_4WorkingWithAreas.Controllers" }
                );
    
            }

    这样保证主项目中的控制器优先,避免冲突。

    3、生成针对指定区域的输出url

    在同一个区域中,产生对同一个区域内的输出url,不需要采用特殊步骤。

    假设当前项目中Admin区域内的路由定义由上面第1点所示。在Admin区域内的/Areas/Admin/Views/Home/Index.cshtml视图中如果有:

    @Html.ActionLink("Click me", "About")

    根据区域内的路由定义,当前视图的控制器为Home,要生成的动作为About,没有id,根据路由定义反推得到生成的html为:

    <a href="/Admin/Home/About">Click me</a>

    但是,如果希望生成的url指向另一个区域,或者是要指向主项目,那就要设置area变量的值。例如:

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

    这指定了名字叫做Support的区域,生成的url为/Support/Home/Index

    如果想生成的url是指向顶级控制器(即,不是在区域中),那么就该把area指定为空字符串

    @Html.ActionLink("Click me to go to top controller", "Index", new{area=""})

    生成的url就是:/Home/Index

    -lyj

  • 相关阅读:
    机器学习书籍推荐
    25个机器学习面试题,期待你来解答
    观点 | 如何优雅地从四个方面加深对深度学习的理解
    Azure Public IP DNS域名
    SSH不允许Root登陆的方法
    MySQL on Azure高可用性设计 DRBD
    Linux ssh 不需要输入密码的方法
    MySQL on Azure高可用性设计 DRBD
    Express Route的配置
    Azure PIP (Instance Level Public IP)
  • 原文地址:https://www.cnblogs.com/brown-birds/p/3764028.html
Copyright © 2020-2023  润新知