MVC区域的后备路线

时间:2017-07-26 11:25:15

标签: asp.net-mvc asp.net-mvc-5 asp.net-core-mvc asp.net-mvc-routing asp.net-mvc-areas

在这里使用asp.net核心MVC应用程序。我已经定义了我的区域,并且路由按预期工作。

我想做的一件事是,如果该区域不存在,则有一个后备路径。

我有以下结构:

APP
-- Areas
   -- SharedArea
      -- Controllers
         -- LoginController
         -- UserController
         -- AnotherController
         -- AndSoOnController
   -- SomeArea1
      -- Controllers
         -- HomeController
   -- SomeArea2
      -- Controllers
         -- HomeController
         -- LoginController

我的最终目标是在区域没有指定控制器的情况下使用共享控制器作为后备。

场景1

用户目前正在浏览SomeArea1并点击LoginLoginController没有SomeArea1,他被定向到SharedArea\Login

场景2

用户目前正在浏览SomeArea2并点击LoginLoginControllerSomeArea2,他被定向到SomeArea2\Login

如何在Startup.cs文件中配置路由?

我在startup.cs中的当前路线设置:

app.UseMvc(routes =>
        {
            routes.DefaultHandler = areaRouter;
            routes.MapRoute("areaRoute", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        });

areaRouter是子域路由的自定义提示,您可以在此处查看更多内容:subdomain routing to areas

1 个答案:

答案 0 :(得分:2)

  

我想做的一件事就是有一个后备路线,以防万一   区域不存在。

为每个区域实施基本控制器。这样,来自这些区域的控制器将使用来自基本控制器的HandleAttribute。它只有1个设置(事实上每个区域一个)

场景1 :在您所在地区创建一个基础(共享)控制器:

[Authorize(ActiveAuthenticationSchemes = "sharedarea")]//see solution for next scenario
public class SharedAreaController : Controller
{
    [AllowAnonymous]
    public login()
    {

    }
}

从此控制器导出SomeArea1控制器:

public class HomeController : SharedAreaController 
{
    // actions for this controller
}

Scenario2 :您注册CookieAuthentication中间件的地方,请执行以下操作:

app.UseCookieAuthentication(o =>
{
    o.LoginPath = "/SomeArea2/login";
    o.AuthenticationScheme = "SomeArea2";
    //TODO: set other interesting properties if you want to
});

然后在您的控制器/操作上,指定身份验证方案,如:

[Authorize(ActiveAuthenticationSchemes = "SomeArea2")]
public IActionResult PageWhichNeedsArea2Auth()
{
    return Content("sth");
}

我希望能提供帮助:)