自定义从MVC5中的控制器级别进行路由?

时间:2015-08-11 15:49:59

标签: c# asp.net-mvc asp.net-mvc-4

我试图在MVC5中定义自定义路由,如下所示。但是,当我打电话http://company.com/protected/Myaccount无效时。我做错了什么。

以及如何使用http://company.com/protected定义默认加载。现在它正在加载http://company.com/

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapMvcAttributeRoutes();
            routes.MapRoute(
                name: "Protected",
                url: "protected/{controller}/{action}/{id}",
                defaults: new { controller = "MyAccount", action = "Index", id = UrlParameter.Optional });

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new {controller = "MyAccount", action = "Index", id = UrlParameter.Optional});
        }

    [RoutePrefix("Protected")]
    [Route("{action=index}")]
    public class MyAccountController : Controller
    {
        // GET: MyAccount
        public ActionResult Index()
        {
            ...
        }
    }

1 个答案:

答案 0 :(得分:0)

编辑:我忘记了你问题的第二部分。

[RoutePrefix("Protected")]
public class MyAccountController : Controller
{
    [Route("Index")] //Route: /Protected/Index
    [Route("")] //Route : /Protected
    [Route("~/")] //Route : /
    public ActionResult Index()
    {
        return View();
    }
}

使用[RoutePrefix]更改对控制器的访问权限,使用[Route]可以更改对操作的访问权限(例如:参数和顺序),并为控制器和应用程序定义默认值。

在这种情况下,我删除"受保护的"在RegisterRoute上路由,因为它没有被使用。 RouteAttributes是另一种解决方案

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        //routes.MapRoute(
        //    name: "Protected",
        //    url: "Protected/{Controller}/{action}/{id}",
        //    defaults: new { controller = "MyAccount", action = "Index", id = UrlParameter.Optional }
        //);

        //routes.MapRoute(
        //    name: "Default",
        //    url: "{controller}/{action}/{id}",
        //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        //);
    }

事实上,属性路由是定义路由的另一种方式,它更灵活。