メールを送信するには、コントローラーのアクションにリンクを作成できる必要があります。これを行うためのベストプラクティスは何ですか?ルートが変わった場合に備えて、自分で構築したくありません。
メールごとにビューを用意してレンダリングして送信する必要がありますか?それはそれを行う良い方法かもしれません。
メールを送信するには、コントローラーのアクションにリンクを作成できる必要があります。これを行うためのベストプラクティスは何ですか?ルートが変わった場合に備えて、自分で構築したくありません。
メールごとにビューを用意してレンダリングして送信する必要がありますか?それはそれを行う良い方法かもしれません。
回答:
特定のアクションへのパスを取得するだけの場合は、次を使用します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.Action(action, controller, routevalue, protocol)
すると完全なURLも生成されるため、必要がない場合はホスト名を指定する必要はありません。
私も同じ問題を抱えていましたが、Gidonの回答には1つの小さな欠陥があるようです。メールで送信できない相対URLが生成されます。
私の解決策は次のようになります:
string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });
このようにして、完全なURLが生成され、アプリケーションがホスティングサーバーのいくつかのレベルの深さにあり、80以外のポートを使用する場合でも機能します。
編集:これも便利だと思いました。