2009-05-06 2 views
1

У меня есть - я думаю - сложный URL-адрес для работы в ASP MVC 1.0: Все мои действия на большинстве контроллеров требуют по два параметра все время: учетная запись и проект. Это соответствует требованиям каждого Action. Это означает, что типичный URL выглядит так:Обработка сложных URL-адресов в ASP MVC

http://abcd.com/myaccount/projects/project_id/sites/edit/12 

В этом примере: MyAccount это имя учетной записи. проектов может быть контроллером, другие варианты похожи на мест, сотрудников. PROJECT_ID является идентификатор проекта в MyAccount, сайтов может быть контроллер, другие варианты, как сотрудников или платежей. Редактирование является действием и является идентификатором сайта, отредактированным. (надеюсь, что это достаточно ясно)

Теперь один из вариантов - создать маршрут и передать project_id и учетную запись во все действия контроллеров, добавив два дополнительных параметра ко всем действиям. Это не очень желательно, и я не уверен, что два контроллера (проекты и сайты) будут работать здесь.

Моей идеальной ситуацией является использование какого-то контекста, который перемещается с вызовом к действию контроллера и хранит в нем project_id и myaccount. Остальные параметры могут быть урегулированы в обычном порядке, как:

// sitescontroller 
public ActionResult Edit(string id) 
{ 
string account = somecontext["account"]; 
string project_id = somecontext["project"]; 
// do stuff 
} 

Любые идеи относительно того, как/где это может произойти? Также как это будет работать с ActionLink (т. Е. Создание правильных ссылок на основе этого контекста)?

Спасибо!

ответ

1

Сначала вам нужно добавить маркеры на свои маршруты, например {company}/projects/{project}{controller}/{action}/{id}. Затем, если вы написали свой собственный IControllerFactory, было бы очень легко вытолкнуть значения из RouteData в контроллер через конструктор или, тем не менее, вы хотели это сделать. Вероятно, самый простой способ начать - это подкласс DefaultControllerFactory и переопределить метод CreateController.

-1

Это не имеет для меня никакого смысла. Почему у вас есть маршрут, похожий на следующий:

{controller}/{id}/{controller}/{id} 

?

+0

Это один из способов взглянуть на него. Это точно так же, как работает Basecamp (37Signals). Если вы создаете учетную запись в Basecamp, вы получаете такой URL-адрес: http://accountName.basecamphq.com/projects/123/notes/345 ZenDesk также точно такой же. (Я думаю, что это GetSatisfaction). Мои требования очень похожи. – Khash

+0

Но, конечно же, имя учетной записи не является контроллером, а параметром, который не нужен контроллеру, но само приложение, чтобы обеспечить доступ к вашим страницам в правильную компанию. Вы могли бы что-то сделать, как предложил Джон Дауни. Мы сделали что-то подобное, где я есть, переопределяя контроллеры родительским контроллером и фиксируя то, что фактически является параметром accountname, и отображают/аутентифицируются по-разному в зависимости от того, кто они и куда они хотят идти. –

Смежные вопросы