ViewContextせずにURLフォームアクション
-
21-08-2019 - |
質問
これは、(例えば、コントローラで)ViewContextを知らなくても、アクションからURLを取得することはできますか?このような何かます:
LinkBuilder.BuildUrlFromExpression(ViewContext context, Expression<Action<T>> action)
...代わりViewContextのController.RouteDataを使用。私はこの上の金属ブロックを持っているように見える。
解決
ここで私は、ユニットテストでそれを行う方法は次のとおりです。
private string RouteValueDictionaryToUrl(RouteValueDictionary rvd)
{
var context = MvcMockHelpers.FakeHttpContext("~/");
// _routes is a RouteCollection
var vpd = _routes.GetVirtualPath(
new RequestContext(context, _
routes.GetRouteData(context)), rvd);
return vpd.VirtualPath;
}
コメントパー、私はコントローラに適応されます:
string path = RouteTable.Routes.GetVirtualPath(
new RequestContext(HttpContext,
RouteTable.Routes.GetRouteData(HttpContext)),
new RouteValueDictionary(
new { controller = "Foo",
action = "Bar" })).VirtualPath;
本当の名前で "foo" と "bar" を交換してください。これは私の頭の上からなので、私はそれが最も効率的なソリューション可能だと保証することはできませんが、それは正しい軌道に乗ってあなたを取得する必要があります。
他のヒント
クレイグ、正しい答えてくれてありがとう。それは素晴らしい作品、そしてそれはまた、私は考えて行きます。
:だから私のドライブに私はあなたのソリューションのバリエーションを開発してきたものをリファクタリング - 抵抗力が「魔法の文字列を」排除しますpublic static string GetUrlFor<T>(this HttpContextBase c, Expression<Func<T, object>> action)
where T : Controller
{
return RouteTable.Routes.GetVirtualPath(
new RequestContext(c, RouteTable.Routes.GetRouteData(c)),
GetRouteValuesFor(action)).VirtualPath;
}
public static RouteValueDictionary GetRouteValuesFor<T>(Expression<Func<T, object>> action)
where T : Controller
{
var methodCallExpresion = ((MethodCallExpression) action.Body);
var controllerTypeName = methodCallExpresion.Object.Type.Name;
var routeValues = new RouteValueDictionary(new
{
controller = controllerTypeName.Remove(controllerTypeName.LastIndexOf("Controller")),
action = methodCallExpresion.Method.Name
});
var methodParameters = methodCallExpresion.Method.GetParameters();
for (var i = 0; i < methodParameters.Length; i++)
{
var value = Expression.Lambda(methodCallExpresion.Arguments[i]).Compile().DynamicInvoke();
var name = methodParameters[i].Name;
routeValues.Add(name, value);
}
return routeValues;
}
私はいくつかは、何を言われて...恐ろしい反射を知っています!私の特定のアプリケーションでは、私はパフォーマンスconerns上回る保守性の利点を考えます。私はこのアイデアやコード上の任意のフィードバックを歓迎します。
所属していません StackOverflow