Переопределить сгенерированные ссылки в MVC - PullRequest
0 голосов
/ 17 февраля 2012

Есть ли простой способ переопределить ссылки, которые MVC генерирует для меня, так что я всегда могу добавить другое значение.

, например, http://www.site.com/{controller}/{action} всегда отображается как http://www.site.com/{controller}/{action}/bob где bob уникален для каждого пользователя и прикрепляется к концу каждой ссылки, созданной с помощью @ Html.ActionLink или @ Url.ActionLink.

Нужно ли переопределять каждый метод или есть где-то еще, я могу вставить этологика?

1 Ответ

1 голос
/ 17 февраля 2012

Звучит так, будто вы действительно хотите настроить схему URL-маршрутизации.Именно для этого предназначен параметр «значения маршрута» в большинстве перегрузок ActionLink.Вы можете предоставить значения этому методу, которые используются для заполнения значений в ваших сопоставленных маршрутах.По умолчанию к одному маршруту добавляется значение «id», поэтому в вашем случае вы можете сделать это:

@Html.ActionLink("link", "Home", "Index", new { id = "bob" })

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

http://www.site.com/Home/Index/bob

Если вам также нужен параметр id, вы можете добавить произвольные новые элементы в карту маршрутов в своем коде Global.asax:

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

Теперь вы можете использовать любой изследующее:

@Html.ActionLink("link", "Home", "Index", new { id = 1 })
@Html.ActionLink("link", "Home", "Index", new { user = "bob" })
@Html.ActionLink("link", "Home", "Index", new { user = "bob", id = 1 })

И вы получите, соответственно:

http://www.site.com/Home/Index/guest/1
http://www.site.com/Home/Index/bob
http://www.site.com/Home/Index/bob/1

MVC-маршрутизация довольно мощная, но, как и большинство мощных, также сложная. Эта статья дает вам хорошее введение.Он написан для старой версии MVC, но основы те же (просто измените [] на {} в маршрутах.)

Кроме того, если вы не хотите, чтобы не забыли добавить пользовательский параметрдля каждого вызова вы можете создать свои собственные методы расширения HtmlHelper или UrlHelper, чтобы сделать это для вас:

public static MvcHtmlString MyActionLink ( this HtmlHelper html, string text, string action, string controller, IDictionary<string, object> attrs)
{
  var data = new { user = GetTheUser() };
  return html.ActionLink(text, action, controller, data, attrs)
}

(при необходимости добавьте дополнительные перегрузки; просто передайте "null" для действия, контроллера, данных и т. д.если вы хотите использовать значения по умолчанию.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...