2009-03-31 15 views
103

電子メールを送信するためにコントローラ上のアクションにリンクを構築できる必要があります。これを行うベストプラクティスは何ですか?自分のルートが変わった場合に備えて自分で作ってほしくない。コントローラでURLを作成する.NET MVC

各メールのビューを用意してレンダリングして送信する必要がありますか?それはそれをする良い方法かもしれません。

答えて

196

あなただけの特定のアクションへのパスを取得したい場合は、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); 

インテリセンスはあなたにそれぞれの意味を与えますパラメータの


コメントからのアップデート:コントローラはすでにUrlHelperがあります

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

フォロー:最後のパラメータ(RouteValueDictionary)ここに秒間 は一例であり: 新しいSystem.Web.Routing.RouteValueDictionary(新しい{ID = 1}) –

+13

あなたが構築する必要はありません。新しいUrlHelper;コントローラーには、正しいRequestContextを持つものを与える.Urlプロパティーがあります。 –

+0

"ルート"はどこから来たのですか?一致させようとしているルートの名前をハードコードする必要がある場合は、URLをハードコードするだけではどうですか? – xr280xr

10

私は同じ問題があったが、ギドンの答えは1つの小さな欠陥を持って表示されます。それは、相対URLを生成し、これができません郵送してください。

私のソリューションは、次のようになります。

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

この方法は、完全なURLを生成し、そしてそれは、アプリケーションがホストしているサーバー上の深いいくつかのレベルで、80以外のポートを使用している場合でも動作します。

編集:thisも同様に有用でした。

19

あなたが(電子メールで送信するには、インスタンスのために)完全なURLが必要な場合は、次のビルトインのいずれかの方法で使用することを検討してください:これにより

ビルドドのURLに使用するデ・ルートを修正:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority) 
をルーティングエンジンは、DEを決定した後、ここにURLが構築さ

は、一つの修正:両方の方法において

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

を、最後の2つのパラメータは、プロトコルとホスト名を指定します。

よろしくお願いいたします。

+6

'Url.Action(action、controller、routevalue、protocol)'を使ったFYIも完全なURLを生成するので、必要がない場合はhostnameを指定する必要はありません。 –

3

アクションへの絶対URLを作成するもう1つの方法:

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

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

私はこれが古い質問ですけど、念のためにあなたがASP.NETコアで同じことをやろうとしている、ここにあります

var urlHelper = new UrlHelper(this.ControllerContext); 

それとも、あなたはControllerから継承する場合は、あなただけのController.Urlプロパティを使用することができますどのようにあなたは、アクション内UrlHelperを作成することができます。

関連する問題