Создание URL-адреса в controller.NET MVC

Мне нужно иметь возможность построить ссылку в действии на контроллере для отправки электронной почты. Какова наилучшая практика для этого? Я не хочу строить его сам, на случай, если мои маршруты изменятся.

должен ли я иметь представление для каждого письма и отображать это и отправлять его? Это может быть хорошим способом сделать это.

5 ответов


если вы просто хотите получить путь к определенному действию, используйте 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); 

Если вам нужен полный 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)

в обоих методах, последние 2 параметра определяет протокол и имя хоста.

С уважением.


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

мое решение выглядит так:

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

таким образом, создается полный URL-адрес, и он работает, даже если приложение находится на хост-сервере на нескольких уровнях и использует порт, отличный от 80.

EDIT: я нашел этой полезно, как хорошо.


другой способ создать абсолютный URL-адрес действия:

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

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

Я знаю, что это старый вопрос, но на всякий случай вы пытаетесь сделать то же самое в ASP.NET ядро, вот как вы можете создать UrlHelper внутри действия:

var urlHelper = new UrlHelper(this.ControllerContext);

или, вы можете просто использовать Controller.Url свойства, если вы наследуете от Controller.