私は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を省略し、最終的にコントローラーのフルネームを取得しました(例:家具であり、家具ではありません)。
ヒントをありがとう。:)これが誰かを助けることを願っています。幸運を!