Muszę być w stanie utworzyć łącze w akcji na kontrolerze, aby wysłać wiadomość e-mail. Jaka jest najlepsza praktyka, aby to zrobić? Nie chcę go konstruować samodzielnie na wypadek zmiany trasy.
Czy powinienem mieć widok dla każdego e-maila, renderować go i wysyłać? To może być dobry sposób na zrobienie tego.
asp.net
asp.net-mvc
ScottBelchak
źródło
źródło
Jeśli potrzebujesz pełnego adresu URL (na przykład do wysłania pocztą elektroniczną), rozważ użycie jednej z następujących wbudowanych metod:
W ten sposób utworzysz trasę, która zostanie użyta do zbudowania adresu URL:
Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
Tutaj adres URL jest tworzony po tym, jak silnik tras określi właściwy:
Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
W obu metodach ostatnie 2 parametry określają protokół i nazwę hosta.
Pozdrowienia.
źródło
Url.Action(action, controller, routevalue, protocol)
generuje również pełny adres URL, więc nie musisz określać nazwy hosta, jeśli nie musisz.Miałem ten sam problem i wygląda na to, że odpowiedź Gidona ma jedną drobną wadę: generuje względny adres URL, którego nie można wysłać pocztą.
Moje rozwiązanie wygląda następująco:
string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });
W ten sposób generowany jest pełny adres URL, który działa nawet wtedy, gdy aplikacja znajduje się na serwerze hostingowym na kilku poziomach i używa portu innego niż 80.
EDIT: Znalazłem ten przydatny również.
źródło
Inny sposób na utworzenie bezwzględnego adresu URL do akcji:
var relativeUrl = Url.Action("MyAction"); //..or one of the other .Action() overloads var currentUrl = Request.Url; var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
źródło
Wiem, że to stare pytanie, ale na wypadek, gdybyś próbował zrobić to samo w ASP.NET Core, oto jak możesz utworzyć UrlHelper wewnątrz akcji:
var urlHelper = new UrlHelper(this.ControllerContext);
Lub możesz po prostu użyć tej
Controller.Url
właściwości, jeśli dziedziczysz zController
.źródło