5

私はStackOverflowを初めて使用するので、無知の兆候は許してください。:)

Visual Studio 2010のMVCアプリケーション(C#で記述されたコントローラー)に多少小さな問題があります。アプリケーションのアクション履歴を生成するメソッドを作成したいので、そのために毎回使用されるコントローラーの名前とアクションを取得したいと思います。残念ながら、私のコントローラー名を保持する文字列の最初の文字は常に欠落しています。私はこのコードを使用しました:

    string url = HttpContext.Current.Request.RawUrl;
    RouteData route = RouteTable.Routes.GetRouteData(new OwnedContext(url));
    var values = route.Values;
    string controllerName = values["controller"].ToString();
    string actionName = values["action"].ToString();

OwnedContextが次のように定義されている場合:

    private class OwnedContext : HttpContextBase
    {
        private readonly HttpRequestBase mockHttpRequestBase;

        public OwnedContext(string appRelativeUrl)
        {
            this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl);
        }

        public override HttpRequestBase Request
        {
            get { return mockHttpRequestBase; }
        }
    }

アクション名は正しく保存されますが、このコードをデバッグすると、controllerName文字列がコントローラーの名前を保持していることがわかりますが、URL文字列が次のパターンの値を保持している場合でも、最初の(大文字)文字は常に欠落しています:/ controller /アクション。

ポインタ、コード例、またはこれが発生する理由の説明をいただければ幸いです。説明が正確でない場合はお知らせください。改善します。

前もって感謝します :)

編集:解決策が見つかりました:

問題を見つけました(一種):OwnedContext(私の元の質問で定義された)に何か問題がありました。最初はHarHaHuが提案したようにrouteValueDictionaryを使用しましたが、GetRouteDataのパラメーターとしてhttpContextを配置するまで、元の問題は解決しませんでした。

    string url = HttpContext.Current.Request.RawUrl;
    RouteData route = RouteTable.Routes.GetRouteData(httpContext);
    UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContext, route));

    var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;
    string controllerName = routeValueDictionary["controller"].ToString();
    string actionName = routeValueDictionary["action"].ToString();

httpContextにカスタムゲッターがある場合:

    public new HttpContextBase httpContext
    {
        get
        {
            HttpContextWrapper context =
                new HttpContextWrapper(System.Web.HttpContext.Current);
            return (HttpContextBase)context;
        }
    }

このようにして、OwnedContextを省略し、最終的にコントローラーのフルネームを取得しました(例:家具であり、家具ではありません)。

ヒントをありがとう。:)これが誰かを助けることを願っています。幸運を!

4

1 に答える 1

4
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;

これをカスタム コンテキストで使用します。

于 2012-03-05T20:46:04.840 に答える