【问题标题】:ASP.NET MVC Routing, Need help creating routeASP.NET MVC 路由,需要帮助创建路由
【发布时间】:2010-08-19 19:03:32
【问题描述】:

我当前的路由规则是

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>

另外,我的管理控制器只有一个索引操作。我有用于所有其他“管理”页面的控制器,例如我的 NewsController 具有用于索引、创建、编辑、删除、列出所有新闻文章和执行 crud 操作的操作。我的结构不正确吗?

我的 AdminController.cs

 [Authorize(Roles = "Administrator")]
    public class AdminController : Controller
    {
        //
        // GET: /Admin/

        public ActionResult Index()
        {
            return View();
        }


    }

返回的 Admin/Index 包含一个带有 ActionLinks 的菜单,就像

<li><%: Html.ActionLink("News Articles", "Index", "News") %></li>

我的 NewsController.cs 具有执行 CRUD 操作的操作。我希望网址是

Admin/News/Edit/5

代替

News/Edit/5

【问题讨论】:

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


    【解决方案1】:

    翻转两个:

    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
    );
    

    如果这不起作用,请将新闻菜单链接的代码添加到您的问题。

    【讨论】:

    • 是的,我猜管理规则太“贪婪”了?它以这种方式抓取我主页上的所有链接。
    【解决方案2】:

    映射是从上到下的,会使用第一个可以申请的路由。在您的情况下,您在默认下有管理员路由。由于可以使用默认值,因此您应该将管理路由放在默认值之上。问题是所有人都会使用那条路线。您需要更具体一点,也许您应该删除 {controller} 以便只有管理员操作会使用该路由。需要更多信息以提供更好的建议。

    【讨论】:

    • 我更新了我的问题,提供了有关我正在尝试做什么的更多信息。
    【解决方案3】:

    我需要使用区域。

    见:http://elegantcode.com/2010/03/13/asp-net-mvc-2-areas/

    我创建了一个名为 Admin 的新区域,将我的 AdminController.cs 重命名为 MenuController.cs,并将所有必需的控制器和视图放置在 Admin 区域文件夹中。在 Admin area 文件夹中有一个名为 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 }
            );
        }
    }
    

    我必须添加控制器 = "Menu",这样当您导航到 /Admin 时,默认情况下它会将您带到 /Admin/Menu/Index。现在我在区域文件夹中的任何控制器都可以访问,例如 /Admin/News/Edit/5 等等。感谢您的尝试,我应该更清楚地知道我是一个绝对的 MVC 菜鸟,并且一开始就不知道区域。

    【讨论】:

    • 我理解领域的方式,我不认为你做得对。我认为您的 ActionLink 不正确。您应该使用路由链接并指定路由名称。
    猜你喜欢
    • 2010-09-13
    • 2011-01-31
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多