我当前的路由规则是
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
);
routes.MapRoute(
"Admin", // Route name
"Admin/{controller}/{action}/{id}", // URL with parameters
new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
我有几个只能由管理员访问的控制器。目前我有一个菜单:
/Admin/Index
其中列出了一堆动作链接。现在点击这些链接中的任何一个重定向就像这个例子:
/News/Index
但我需要它像:
/Admin/News/Index
这种当前的设置类型有效,但是我的主页上的链接被错误的规则捕获,例如/ Admin / Article / 1它们应该只是/ Article / 1
我已经搜索了StackOverflow的答案,并发现了一些接近 - 但我仍然不太了解路由,以便利用他们的答案。任何帮助表示赞赏。
修改
以下是来自主页的链接集合,这些链接被路由规则错误地捕获
<div id="menucontainer">
<ul id="menu">
<li><%: Html.ActionLink(" ", "About", "Home", null, new { ID = "AboutMHN" })%></li>
<li><%: Html.ActionLink(" ", "Products", "Home", null, new { ID = "Products" })%></li>
<li><%: Html.ActionLink(" ", "HubLocator", "Home", null, new { ID = "HubLocator" })%></li>
<li><%: Html.ActionLink(" ", "ResellerProgram", "Home", null, new { ID = "ResellerProgram" })%></li>
<li><%: Html.ActionLink(" ", "ResellerLogin", "Home", null, new { ID = "ResellerLogin" })%></li>
<li><%: Html.ActionLink(" ", "ContactUs", "Home", null, new { ID = "ContactUs" })%></li>
</ul>
</div>
另外,我的Admin控制器只有一个索引操作。我有所有其他'Admin'页面的控制器,例如我的NewsController有索引,创建,编辑,删除,列出所有新闻文章和执行crud操作的操作。我错误地构建了这个吗?
我的AdminController.cs
[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
//
// GET: /Admin/
public ActionResult Index()
{
return View();
}
}
此返回的管理员/索引包含一个带有ActionLinks的菜单,就像
一样<li><%: Html.ActionLink("News Articles", "Index", "News") %></li>
My NewsController.cs具有执行CRUD操作的操作。我希望网址是
Admin/News/Edit/5
而不是
News/Edit/5
答案 0 :(得分:0)
翻转两个:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Admin", // Route name
"Admin/{controller}/{action}/{id}", // URL with parameters
new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
如果这不起作用,请将新闻菜单链接的代码添加到您的问题中。
答案 1 :(得分:0)
映射是从上到下,将使用可以应用的第一条路线。在您的情况下,您在默认情况下有管理路由。由于可以使用Default,因此您应将Admin route放在Default之上。问题是所有人都会使用这条路线。您需要更具体一些,也许您应该删除{controller},以便只有Admin操作才会使用该路由。需要更多信息才能提供更好的建议。
答案 2 :(得分:0)
我需要使用区域。
请参阅:http://elegantcode.com/2010/03/13/asp-net-mvc-2-areas/
我创建了一个名为Admin的新区域,将我的AdminController.cs重命名为MenuController.cs,并将所有必需的控制器和视图放在Admin区域文件夹中。在Admin区域文件夹中,有一个名为AdminAreaRegistration.cs的文件,其中包含
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 { controller= "Menu", action = "Index", id = UrlParameter.Optional }
);
}
}
我必须在控制器=“菜单”中添加,这样当您导航到/ Admin时,默认情况下会将您带到/ Admin / Menu / Index。现在,区域文件夹中的任何控制器都可以像/ Admin / News / Edit / 5那样访问。谢谢你的尝试,我应该更清楚我是一个绝对的MVC菜鸟,并且不知道开始的区域。