Не можете найти проект? Перенаправляет на следующий маршрут - PullRequest
1 голос
/ 15 ноября 2011

У меня есть проект, доступ к которому можно получить по 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
);

Действие

Когда вы просматриваете URL-адрес «myapp.com / project / create», я хотел бы, чтобы вызывалось «создать» действие, а не мое «детальное» действие.

Но URL 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);
}

Вопрос

Как сделать, чтобы Create, Delete, Edit интерпретировались по маршруту по умолчанию?

1 Ответ

1 голос
/ 15 ноября 2011

Вот маршрут создания с вашим существующим маршрутом:

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 вашего проекта должно быть url, а не projectUrl, так как это имя значения маршрута.

Вот мой ProjectController:

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

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

При переходе по любому из этих URL-адресов выполняется соответствующее действие:

  • / project / create
  • / project / test
  • / project / test / details

И передайте «test» в качестве значения URL.

Стоит отметить, что маршруты обрабатываются в порядке их добавления , поэтому вам нужно убедиться, что они идут в порядке от , наиболее специфичном для наиболее общего , как выиметь, а не перевернуть это.

...