Создать новый URL-адрес путем замены действия в текущем URL-адресе - PullRequest
0 голосов
/ 07 февраля 2012

Мне любопытно, возможно ли это, или, как я подозреваю, по замыслу нет. В проекте ASP.NET MVC у меня есть несколько маршрутов, как это:

new Route(
                    url, // This can be arbitrary
                    new RouteValueDictionary {
                                                            {"area", "MyArea"},
                                                            {"controller", "MyController"},
                                                            {"action", "Index"}
                                                        },
                    new RouteValueDictionary(),
                    new RouteValueDictionary {
                                                            {"area", "MyArea"},
                                                        },
                    new MvcRouteHandler()))

Я хотел бы создать URL (или ссылки) в представлениях (Razor), используемых действиями MyController. Эти URL должны указывать на другое действие MyController.

Теперь проблема в том, что есть несколько маршрутов, как указано выше, зарегистрированных под разными URL-адресами, поэтому простой вызов Html.ActionLink () или Url.Action () с текущими значениями маршрута дает ссылку, которая указывает на URL-адрес, которому маршрут соответствует в первую очередь. Это. Это не обязательно URL, из которого в данный момент вызывается действие.

В общем, я бы хотел взять текущий маршрут и заменить действие другим. Я не мог найти способ сделать это. URL-адреса могут быть произвольными, но при необходимости могут применяться ограничения, например, так что URL должен содержать токен действия. Фактически все они в настоящее время делают, поэтому URL имеют следующую структуру:

/AnotherArea/SubSegment/{action} // Routes point from other areas to MyArea/MyController

Эти URL-адреса находятся в Html.ViewContext.RouteData.Route.Url представления, поэтому маркер действия должен быть каким-либо образом изменен при создании нового URL-адреса. (Ну, это можно сделать с помощью замены строки, но я думаю, что если есть решение, оно должно быть лучше.) Спасибо за ваше время!

1 Ответ

0 голосов
/ 07 февраля 2012

Теперь я нашел решение, довольно простое:

@Url.RouteUrl("RouteName", new { Action = "OtherAction" })

Однако это подразумевает знание названия используемого в настоящее время маршрута.Поскольку это не хранится в самом объекте Route, я выбрал своеобразное решение - сохранить имя в словаре DataTokens маршрута.Это, по-видимому, не вредит, и, поскольку маршруты выполняются через службу, не следует помнить об этом соглашении об использовании DataTokens.

Хотя мне интересно, есть ли лучшее решение.

...