165

ASP.NET MVC のモデルでいくつかの URL を生成する必要があります。ルートを使用して URL を生成する UrlHelper.Action() のようなものを呼び出したいと思います。ホスト名、スキームなどの通常の空白を埋めてもかまいません。

そのために呼び出すことができる方法はありますか?UrlHelper を構築する方法はありますか?

4

7 に答える 7

282

役立つヒント、どのASP.NETアプリケーションでも、現在のHttpContextの参照を取得できます

HttpContext.Current

これはSystem.Webから派生しています。したがって、以下はASP.NETMVCアプリケーションのどこでも機能します。

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;
    }
}

作成されたMyModelオブジェクトのプロパティを呼び出すとLink、Global.asaxのルーティングに基づいてモデルを表示するための有効なURLが返されます。

于 2010-01-09T02:42:35.580 に答える
69

私はオマールの答えが好きですが、それは私にとってはうまくいきません。記録のために、これは私が現在使用しているソリューションです:

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);
于 2010-01-09T03:32:45.387 に答える
49

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)));

(ブライアンの回答に基づいて、マイナーなコード修正が追加されました。)

于 2010-01-09T02:04:20.287 に答える
8

はい、インスタンス化できます。次のようなことができます:

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

RouteTable.Routesは静的プロパティなので、問題ありません。へのHttpContextBase参照を取得HttpContextWrapperHttpContext、それをHttpContext配信します。

于 2010-01-09T02:14:26.600 に答える
0

ページ内(コントローラーの外側)から同様のことをしようとしていました。

UrlHelper では、Pablos の回答ほど簡単に作成することはできませんでしたが、同じことを効果的に行うための古いトリックを思い出しました。

string ResolveUrl(string pathWithTilde)
于 2015-02-17T15:39:57.157 に答える
-30

あなたが探しているのはこれだと思います:

Url.Action("ActionName", "ControllerName");
于 2010-01-09T02:03:17.400 に答える