ASP.NET MVC路由,需要帮助创建路由

时间:2010-08-19 19:03:33

标签: asp.net-mvc asp.net-mvc-routing

我当前的路由规则是

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

3 个答案:

答案 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菜鸟,并且不知道开始的区域。