ASP.Net MVC со сложными маршрутами - как сохранить его «в здравом уме»? - PullRequest
8 голосов
/ 04 марта 2012

У меня есть клиент, который желает использовать соглашение об именовании URL в соответствии с:

/{subjectarea}/{subject}/{action}

Что хорошо - это прекрасно работает, с одним контроллером на предметную область, и выполнение действия после идентификатора (субъекта) вообще не проблема.

Однако это усложняется, так как клиент затем хочет продолжить иерархию:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}

У меня есть контроллер для тесно связанной темы (это просто другая предметная область), которая обрабатывает всю сторону администратора, но клиент настаивает на том, чтобы общедоступное представление зависло от родительского субъекта, а не от его собственного корня.

Как я могу сделать это, избегая при этом нарушения всех принципов MVC, а также избегая повторной реализации тонны предоставляемых ASP.Net MVC функциональных возможностей в моем контроллере предметной области, чтобы иметь возможность обрабатывать связанные объекты с того же контроллера

Можно ли каким-то образом вызвать связанный контроллер субъекта из родительского контроллера субъекта и вернуть полученное представление (так как это сохранит разделение функций для субъектов на их собственные контроллеры)? Если это возможно, это решит множество проблем с этим.

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Вот решение, которое решает мою данную проблему - надеюсь, оно решит кого-то другого.

Как упоминалось в моем комментарии к Роберту Харви, все, что мне на самом деле нужно, - это другой маршрут, в котором не используются первые два илитри компонента, такие как контроллер, действие и идентификатор, но вместо этого принимают эти значения позже - если вы также повесите это статическое значение на маршруте, это будет гораздо проще сделать.

Итак, вотURL-адрес, по которому я решил упростить маршрут:

/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}

Маршрут, который удовлетворяет этому URL, выглядит следующим образом:

        routes.MapRoute(
            "RelatedSubjects",
            "{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}",
            new { controller = "shoes", action = "view", id = "all" }
        );

В последующем действии контроллера я могу запросить значения параметровдля parentcontroller и parentubject, поэтому я могу отфильтровать связанный элемент, чтобы он был специфичным для данного родительского объекта - проблема решена!

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

Я мог бы сделать это полностью без / related / static portion поскольку маршрут может легко совпадать только по количеству значений, и, на самом деле, я действительно могу это сделать - однако я считаю, что для последующего администрирования лучше использовать статический элемент для подтверждения использования маршрута.

Надеюсь, это кому-нибудь поможет!

1 голос
/ 04 марта 2012

Один из способов сделать это - указать маршрутный символ (обратите внимание на звездочку):

routes.MapRoute("subjects", "{action}/{*path}",
    new { controller = "Subjects", action = "Index" });

Это позволяет контроллеру получить всю строку пути после action.

* 1006.* Затем вы можете получить иерархию субъектов в методе контроллера следующим образом:
string[] subjects = path.Split('/');

Получив это, вы можете делать все, что захотите, в том числе отправлять различных субъектов различным методам обработки для обработки.

...