我已将我的项目重组为更合理的层次结构:
-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下为每个控制器添加一个路径?
答案 0 :(得分:1)
你有没有评估Attribute Routing in MVC 5?看起来你正在开始一个新项目,所以这可能是一个很好的新开始。使用[RoutePrefix]
attribute,您可以轻松实施您想要实现的目标:
[RoutePrefix("accounts")]
public class CustomersController : Controller
{
// ...
}
我们还没有使用属性路由,所以我不能说自己的经验,但它看起来非常灵活和有前途。
我为你创建了一个GIST,在那里我解释了如何验证属性,而不是在编译期间,而是使用单元测试。这是一个为MS Test设计的简单代码。验证的可能性非常广泛。
自定义逻辑我们可能会添加到自定义RoutePrefixAttribute
?例如,RoutePrefixAttribute允许将字符串作为参数。您可以将其重写为仅允许特定Enum
作为参数,该参数仅列出可能的值,并在内部设置Prefix
字符串。