找不到项目?重定向到下一个路线

时间:2011-11-15 17:21:28

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

我有一个可以通过URL访问的项目:

myapp.com/project/my-project

路线

为了能够使用这条路线,我在Global.asax中记录了以下内容

routes.MapRoute(
    "Project", // Route name
    "Project/{url}/{action}", // URL with parameters
    new { controller = "Project", action = "Details" } // Parameter defaults
);

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

动作

当你浏览网址'myapp.com / project / create'时,我想调用'create'动作,而不是我的'详细动作'。

但网址myapp.com/project/my-project通常应由details操作解释。

public ActionResult Details(string projectUrl)
{
    var project = _projectService.Get(projectUrl);

    if (project == null)
        //Not found! Redirect to next route!

    var model = Mapper.Map<ProjectViewModel>(project);

    return View(model);
}

问题

如何通过默认路由解释CreateDeleteEdit

1 个答案:

答案 0 :(得分:1)

以下是您现有路线的创建路线:

routes.MapRoute(
    "ProjectCreate", // Route name
    "project/create", // URL with parameters
    new { controller = "Project", action = "Create" } // Parameter defaults
);

routes.MapRoute(
    "Project", // Route name
    "project/{url}/{action}", // URL with parameters
    new { controller = "Project", action = "Details" } // Parameter defaults
);

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

您的项目网址参数名称应为url而不是projectUrl,因为这是路由值的名称。

这是我的ProjectController

public ActionResult Details(string url)
{
    return View();
}

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

当我转到其中任何一个网址时,会遇到相应的操作:

  • /项目/创建
  • /项目/测试
  • /项目/测试/细节

并将“test”作为url值传递。

值得注意的是,路线按照添加顺序进行处理,因此您需要确保它们按顺序从最具体到最常见顺序排列,而不是逆转。