ASP.NET MVC路由到没有区域

时间:2017-12-06 15:27:42

标签: asp.net-mvc asp.net-mvc-5 routes url-routing

我已将我的项目重组为更合理的层次结构:

-Controllers  
  -Accounts  
    -CustomersController  
  -Setup  
    -SystemDefaultsController
    -SettingsController
  -HomeController

目前,我只是尝试设置我的网址以匹配此结构。所以有效的示例网址是:

localhost:1234/Home/Index
localhost:1234/Setup/SystemDefaults/Index
localhost:1234/Setup/Settings/Index
localhost:1234/CustomerAccounts/Index

所以我在RouteConfig.cs中的默认路由之上添加了一条路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();

    //AreaRegistration.RegisterAllAreas();

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Setup",
        url: "Setup/{controller}/{action}/{id}",
        defaults: new { controller = "Setup", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "MVCWeb.Controllers.Setup" }
    );

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

这确实使上述网址有效,但它没有任何限制,因此当我希望这些网址无效时,这些网址会有效:

本地主机:1234 /设置/ CustomerAccounts /索引 本地主机:1234 / SystemDefaults /索引

此外,由于Setup路由匹配所有内容,如果我执行以下任一操作:

@Html.ActionLink("Customer Accounts", "Index", "CustomerAccounts")
@Url.Action("Index", "CustomerAccounts")

它生成的网址为/Setup/CustomerAccounts/Index,而不是/CustomerAccounts/Index

在路由网址中仍然使用{controller}时,有没有办法在不使用区域的情况下完成此操作?或者我是否必须在Setup下为每个控制器添加一个路径?

1 个答案:

答案 0 :(得分:1)

你有没有评估Attribute Routing in MVC 5?看起来你正在开始一个新项目,所以这可能是一个很好的新开始。使用[RoutePrefix] attribute,您可以轻松实施您想要实现的目标:

[RoutePrefix("accounts")]
public class CustomersController : Controller
{
    // ...
}

我们还没有使用属性路由,所以我不能说自己的经验,但它看起来非常灵活和有前途。

更新

  1. 我为你创建了一个GIST,在那里我解释了如何验证属性,而不是在编译期间,而是使用单元测试。这是一个为MS Test设计的简单代码。验证的可能性非常广泛。

  2. 自定义逻辑我们可能会添加到自定义RoutePrefixAttribute?例如,RoutePrefixAttribute允许将字符串作为参数。您可以将其重写为仅允许特定Enum作为参数,该参数仅列出可能的值,并在内部设置Prefix字符串。