从MVC 2.0中的静态上下文访问System.Web.Routing.RequestContext

Dav*_*ale 6 c# asp.net-mvc-2

我需要System.Web.Routing.RequestContext在视图模型中使用才能调用HtmlHelper.GenerateLink().

在MVC 1.0中,通过强制转换当前可以静态获取上下文IHttpHandler:

 var context = ((MvcHandler) HttpContext.Current.CurrentHandler).RequestContext;
Run Code Online (Sandbox Code Playgroud)

现在该项目已升级到MVC 2.0,并且抛出了此异常:

无法将"ServerExecuteHttpHandlerWrapper"类型的对象强制转换为"System.Web.Mvc.MvcHandler".

我不确定它是否相关,但这是在IIS6上的.NET 4.0中运行的.

Dar*_*rov 16

我需要在视图模型中使用System.Web.Routing.RequestContext才能调用HtmlHelper.GenerateLink().

理论上你可以写:

var rc = HttpContext.Current.Request.RequestContext;
Run Code Online (Sandbox Code Playgroud)

在实践中,你绝对不应该在视图模型中做这样的事情.这就是HTML帮助者应该做的事情:

public static MvcHtmlString GenerateMyLink<MyViewModel>(this HtmlHelper<MyViewModel> html)
{
    MyViewModel model = html.ViewData.Model;
    RequestContext rc = html.ViewContext.RequestContext;
    //TODO: use your view model and the HttpContext to generate whatever link is needed
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在您的强类型到MyViewModel视图中简单地:

<%= Html.GenerateMyLink() %>
Run Code Online (Sandbox Code Playgroud)

  • 在我开始工作之前写的任何东西对我来说都是遗产!:d (2认同)

ben*_*asd 11

我不知道你想做什么System.Web.Routing.RequestContext?查看:

var context = new HttpContextWrapper(System.Web.HttpContext.Current);
var routeData = RouteTable.Routes.GetRouteData(context);

// Use RouteData directly:
var controller = routeData.Values["controller"];

// Or with via your RequestContext:
var requestContext = new RequestContext(context, routeData);
controller = requestContext.RouteData.Values["controller"]
Run Code Online (Sandbox Code Playgroud)