コントローラー.NET MVCでURLを作成する


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
フォローアップ:最後から2番目のパラメーター(RouteValueDictionary)の例は次のとおりです:new System.Web.Routing.RouteValueDictionary(new {id = 1})
Matthew M.

15
新しいUrlHelperを作成する必要はありません。コントローラーには.Urlプロパティがあり、正しいRequestContextを提供します。
Tobias J

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

@ xr280xr:この例では、「ルート」はRegisterRoutesメソッド(通常はRouteConfig内)で定義されたルートの名前であると思います。私にとっては、「デフォルト」でした(プロジェクトを作成したときと同じです)。
アンディ

3
UrlHelperを新しく作成する必要はありません。ControllerクラスのUrlプロパティにアクセスするだけです。
Jay Douglass

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)

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

よろしく。


7
FYIを使用Url.Action(action, controller, routevalue, protocol)すると完全なURLも生成されるため、必要がない場合はホスト名を指定する必要はありません。
Endy Tjahjono、2012

1
ポート番号が2倍になった次のURLを取得しています。どうすれば修正できますか?http:// localhost:54383:54383 / MyArea / MyController / Details / 1
Patee Gutee 2018

12

私も同じ問題を抱えていましたが、Gidonの回答には1つの小さな欠陥があるようです。メールで送信できない相対URLが生成されます。

私の解決策は次のようになります:

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

このようにして、完全なURLが生成され、アプリケーションがホスティングサーバーのいくつかのレベルの深さにあり、80以外のポートを使用する場合でも機能します。

編集:これも便利だと思いました。


これには重大なセキュリティ上の脆弱性があることに注意してください。要求ヘッダーを変更して悪意のあるURLをホストとして含めるだけで、アプリケーションは危険なWebサイトへのリンクを含む公式の電子メールを送信します。
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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.