Створення URL-адреси в контролері .NET MVC


131

Мені потрібно мати можливість створити посилання в дії на контролері для надсилання електронного листа. Яка найкраща практика для цього? Я не хочу його будувати самостійно, якщо мій маршрут зміниться.

Чи повинен я мати перегляд для кожного електронного листа та відредагувати його та надіслати? Це може бути хорошим способом зробити це.

Відповіді:


230

Якщо ви просто хочете пройти шлях до певної дії, використовуйте UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

якщо ви хочете створити гіперпосилання:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense надасть вам значення кожного з параметрів.


Оновлення з коментарів : у контролера вже є UrlHelper:

string url = this.Url.Action("About", "Home", null); 

17
Продовження: Для другого за останнім параметром (RouteValueDictionary) ось приклад: новий System.Web.Routing.RouteValueDictionary (новий {id = 1})
Меттью М.

15
Вам не потрібно конструювати новий UrlHelper; на контролері є властивість .Url, яке надасть вам правильний RequestContext.
Tobias J

Звідки береться «Корінь»? Якщо мені доведеться жорстко вписати назву маршруту, на який я намагаюся відповідати, чому б не просто жорсткий код URL-адреси?
xr280xr

@ xr280xr: Я вважаю, що в цьому прикладі "Корінь" - це назва маршруту, визначений у методі RegisterRoutes (як правило, в RouteConfig). Для мене це було "За замовчуванням" (як це було, коли я створював свій проект).
Енді

3
Вам не потрібно створювати UrlHelper, достатньо отримати доступ до властивості Url у класі Controller.
Джей Дуглас

22

Якщо вам потрібна повна URL-адреса (наприклад, надіслати електронною поштою), подумайте про використання одного з таких вбудованих методів:

За допомогою цього ви створюєте маршрут, який використовуватимуть для створення URL-адреси:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Тут побудований URL після того, як двигун маршруту визначить правильний:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

В обох методах останні два параметри вказують протокол та ім'я хоста.

З повагою


7
FYI Url.Action(action, controller, routevalue, protocol)також використовує повну URL-адресу, тому вам не потрібно вказувати ім'я хоста, якщо цього не потрібно.
Endy Tjahjono

1
Я отримую таку URL-адресу з подвоєним номером порту, як це виправити, будь ласка? http: // localhost: 54383: 54383 / MyArea / MyController / Деталі / 1
Patee Gutee

12

У мене була така ж проблема, і, здається, відповідь Гідона має один крихітний недолік: він генерує відносну URL-адресу, яку неможливо надіслати поштою.

Моє рішення виглядає так:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

Таким чином, генерується повна URL-адреса, і вона працює, навіть якщо додаток знаходиться на декількох рівнях на сервері хостингу та використовує інший порт, ніж 80.

EDIT: Я також вважав це корисним.


Зауважте, що це має велику вразливість безпеки. Все, що знадобиться - це те, що хтось змінює заголовок запиту, щоб він містив шкідливу URL-адресу як хост, і ваша програма надіслала офіційний електронний лист із посиланням на небезпечний веб-сайт.
V0ldek

7

Ще один спосіб створити абсолютну URL-адресу до дії:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);

4

Я знаю, що це старе питання, але на всякий випадок, коли ви намагаєтесь зробити те саме в ASP.NET Core, ось як ви можете створити UrlHelper всередині дії:

var urlHelper = new UrlHelper(this.ControllerContext);

Або ви можете просто скористатися Controller.Urlмайном, якщо ви отримаєте спадщину від Controller.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.