【问题标题】:Create a route with an additional url parameter without creating an area使用附加 url 参数创建路由而不创建区域
【发布时间】:2013-08-15 20:47:10
【问题描述】:

我正在使用 .Net MVC 4 为客户端构建一个站点。整个站点使用默认的 MVC 4 路由,所有页面都可以正常工作

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        )

网站上有一个名为“教师”的页面。对于此页面,有几个链接可将您带到新页面,这些新页面是“教师”页面的子集。客户端希望 url 结构看起来像这样

www.{mysite}.com/School/Teachers/Apply

www.{mysite}.com/School/Teachers/Benefits

我想我可以简单地将 Apply 和 Benefits 页面作为 ActionResult 添加到 SchoolController 中,然后使用 MVC 中的路由功能将 url 映射到 SchoolController 中正确的 ActionResult 方法。

这是我的控制器:

public class SchoolController : Controller
{

    public ActionResult Index()
    {

        return View();
    }

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

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

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

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

这是我尝试的自定义路线。

routes.MapRoute(
       "Teachers",
       "{controller}/{page}/{action}",
       new { controller = "School", page = "Teachers", action = "Index" }
           )

我将此路由放在默认路由之前,但这会将“教师”添加到网站上的每个网址,如下所示:

www.{mysite}.com/{controller}/teachers/{action}

摘要

我网站上的所有页面都使用这个 url 结构:

www.{mysite}.com/{controller}/{action}

然而,这一页具有以下结构:

www.{mysite}.com/{controller}/teachers/{action}

我怎样才能用路线做到这一点?

【问题讨论】:

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


    【解决方案1】:
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            name: "TeachersActions",
            url: "School/Teachers/{action}",
            defaults: new { controller = "School" },
            constraints: new { action = "Apply|Benefits" } // actions under Teachers
        );
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index",
                            id = UrlParameter.Optional }
        );
    }
    

    您希望在教​​师下的任何操作都应添加到路由中。实际上没有必要为该路由指定默认的操作或页面(除非您确实需要捕获页面路由值)。这里的问题是,用户仍然可以通过输入 URL School/{action} 来定位“教师”下的操作,因为它被默认路由捕获。现在,这可能对您来说是一个问题,也可能不是。就我个人而言,我不会认为这是一个大问题,因为用户应该只是使用网站的导航而不是手动输入 URL。

    【讨论】:

    • 路线顺序很重要,这条路线只有在默认路线之前才有效。
    • @ErikPhilips 没错,这条路线非常具体,他们确实声明他们已将路线放置在默认路线之前。
    • @asymptoticFault 我尝试了你的新答案。所有其他控制器都正常工作。现在唯一的问题是我的 Teachers 控制器中其他 ActionResults 的 url 如下所示:www.mysite.com/school/teachers/teachers/
    • 它仍然在 School 控制器中的所有其他 ActionResults 之前添加 Teachers
    • 很可能是正确的,我没有想过这会如何影响 UrlHelper 生成 url,也没有考虑到 @Html.ActionLink 和其他生成 url 的 HtmlHelper 操作。您绝对可以根据您的评论更新答案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2020-01-27
    • 1970-01-01
    • 2020-02-05
    • 2015-11-21
    • 2018-08-04
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多