IT박스

ASP.NET MVC의 모델에서 UrlHelper 호출

itboxs 2020. 6. 6. 09:00
반응형

ASP.NET MVC의 모델에서 UrlHelper 호출


ASP.NET MVC의 모델에서 일부 URL을 생성해야합니다. URL을 생성하기 위해 경로를 사용하는 UrlHelper.Action ()과 같은 것을 호출하고 싶습니다. 호스트 이름, 구성표 등과 같은 일반적인 공백을 채우는 것은 중요하지 않습니다.

내가 요청할 수있는 방법이 있습니까? UrlHelper를 구성하는 방법이 있습니까?


유용한 팁 : 모든 ASP.NET 응용 프로그램에서 현재 HttpContext에 대한 참조를 얻을 수 있습니다.

HttpContext.Current

System.Web에서 파생됩니다. 따라서 다음은 ASP.NET MVC 응용 프로그램의 어느 곳에서나 작동합니다.

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
url.Action("ContactUs"); // Will output the proper link according to routing info

예:

public class MyModel
{
    public int ID { get; private set; }
    public string Link
    {
        get
        {
            UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
            return url.Action("ViewAction", "MyModelController", new { id = this.ID });
        }
    }

    public MyModel(int id)
    {
        this.ID = id;
    }
}

Link생성 된 MyModel 객체 에서 속성을 호출하면 Global.asax의 라우팅을 기반으로 모델을 볼 수있는 유효한 Url이 반환됩니다.


나는 Omar의 대답을 좋아하지만 그것은 나를 위해 작동하지 않습니다. 기록을 위해 이것은 현재 사용중인 솔루션입니다.

var httpContext = HttpContext.Current;

if (httpContext == null) {
  var request = new HttpRequest("/", "http://example.com", "");
  var response = new HttpResponse(new StringWriter());
  httpContext = new HttpContext(request, response);
}

var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);

return new UrlHelper(requestContext);

UrlHelper는 다음을 사용하여 Controller 조치 내에서 구성 할 수 있습니다.

 var url = new UrlHelper(this.ControllerContext.RequestContext);
 url.Action(...);

컨트롤러 외부에서 RouteTable.Routes RouteData에서 RequestContext를 만들어 UrlHelper를 구성 할 수 있습니다.

HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));

(Brian의 답변을 바탕으로 사소한 코드 수정이 추가되었습니다.)


예, 인스턴스화 할 수 있습니다. 당신은 다음과 같은 것을 할 수 있습니다 :

var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
   new RequestContext(ctx,
   RouteTable.Routes.GetRouteData(ctx));

RouteTable.Routes정적 속성이므로 여기서 확인해야합니다. 얻을 HttpContextBase참조를 HttpContextWrapper참조 소요 HttpContext, 그리고 HttpContext그을 제공합니다.


다른 모든 대답을 시도한 후에 나는 결국

$"/api/Things/Action/{id}"

증오자는 ¯ \ _ (ツ) _ / ¯


페이지 내에서 (컨트롤러 외부에서) 비슷한 것을하려고했습니다.

UrlHelper를 사용하면 Pablos가 대답하는 것처럼 쉽게 구성 할 수 없었지만 동일한 작업을 효과적으로 수행하는 오래된 트릭을 기억했습니다.

string ResolveUrl(string pathWithTilde)

나는 당신이 찾고있는 것이 이것이라고 생각합니다.

Url.Action("ActionName", "ControllerName");

참고URL : https://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc

반응형