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

C# 在MVC 2.0中从静态上下文访问System.Web.Routing.RequestContext,c#,asp.net-mvc-2,C#,Asp.net Mvc 2,我需要在视图模型中使用System.Web.Routing.RequestContext,以便调用HtmlHelper.GenerateLink() 在MVC1.0中,可以通过强制转换当前的IHttpHandler,静态地获取上下文: var context = ((MvcHandler) HttpContext.Current.CurrentHandler).RequestContext; 现在,该项目已升级到MVC 2.0,演员阵容中将引发此异常: 无法将“ServerExecuteHt

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

在MVC1.0中,可以通过强制转换当前的
IHttpHandler
,静态地获取上下文:

 var context = ((MvcHandler) HttpContext.Current.CurrentHandler).RequestContext;
现在,该项目已升级到MVC 2.0,演员阵容中将引发此异常:

无法将“ServerExecuteHttpHandlerRapper”类型的对象强制转换为“System.Web.Mvc.MvcHandler”类型

我不确定它是否相关,但这是在IIS6的.NET4.0中运行的

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

理论上你可以写:

var rc = HttpContext.Current.Request.RequestContext;
实际上,绝对不应该在视图模型中执行类似操作。这就是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
    ...
}
public static MvcHtmlString GenerateMyLink(此HtmlHelper html)
{
MyViewModel model=html.ViewData.model;
RequestContext rc=html.ViewContext.RequestContext;
//TODO:使用视图模型和HttpContext生成所需的链接
...
}
在强类型到MyViewModel视图中:

<%= Html.GenerateMyLink() %>

我不知道你想用
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"]

谢谢Darin-这是我试图回避重构遗留代码:)@David Neale,ASP.NET MVC 1.0已经被认为是遗留代码了?哈哈。我喜欢。在我开始工作之前写的任何东西都是我的遗产!:D@David尼尔,好极了。在这种情况下,我担心这不仅是遗留代码,而且是糟糕的代码,因为即使在ASP.NET MVC 1.0视图模型中也不应该依赖于RequestContext。感谢Ben-接受这一点,因为它直接回答了我的问题,但我建议任何未来的读者注意Darin的答案。