컨트롤러 .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
후속 조치 : 두 번째에서 마지막 매개 변수 (RouteValueDictionary)의 예는 다음과 같습니다. new System.Web.Routing.RouteValueDictionary (new {id = 1})
Matthew M.

15
새로운 UrlHelper를 구성 할 필요가 없습니다. 컨트롤러에는 .Url 속성이 있으며 올바른 RequestContext를 제공합니다.
Tobias J

"루트"는 어디에서 왔습니까? 일치시키려는 경로의 이름을 하드 코딩해야하는 경우 URL을 하드 코딩하는 것이 어떻습니까?
xr280xr

@ xr280xr :이 예제에서 "Root"는 RegisterRoutes 메서드 (일반적으로 RouteConfig)에 정의 된 경로 이름입니다. 나에게 그것은 "기본"이었습니다 (프로젝트를 만들 때와 마찬가지로).
Andy

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을 결정한 후에 작성됩니다.

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

두 방법 모두에서 마지막 2 개의 매개 변수는 프로토콜과 호스트 이름을 지정합니다.

문안 인사.


7
참고로 사용 Url.Action(action, controller, routevalue, protocol)하면 전체 URL이 생성되므로 필요하지 않은 경우 호스트 이름을 지정할 필요가 없습니다.
Endy Tjahjono

1
포트 번호가 두 배로 다음 URL을 얻는 중이 문제를 어떻게 해결합니까? http : // localhost : 54383 : 54383 / MyArea / MyController / Details / 1
Patee Gutee

12

나는 같은 문제를 겪었고 Gidon의 대답에는 하나의 작은 결함이있는 것처럼 보입니다. 메일로 보낼 수없는 상대 URL을 생성합니다.

내 솔루션은 다음과 같습니다.

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

이렇게하면 전체 URL이 생성되며 응용 프로그램이 호스팅 서버에서 여러 수준의 깊이에 있고 80 이외의 포트를 사용하더라도 작동합니다.

편집 : 나는 이것도 유용하다는 것을 알았 습니다.


이 취약점에는 주요 보안 취약점이 있습니다. 호스트로 악의적 인 URL을 포함하도록 요청 헤더를 수정하는 사람 만 있으면 응용 프로그램에서 위험한 웹 사이트에 대한 링크가 포함 된 공식 전자 메일을 보냅니다.
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.