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

本文关键字:System 访问 Web Routing RequestContext 上下文 静态 MVC | 更新日期: 2023-09-27 17:57:39

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

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

 var context = ((MvcHandler) HttpContext.Current.CurrentHandler).RequestContext;

现在该项目已经升级到MVC 2.0,并且在cast:上抛出了这个异常

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

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

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

我需要在视图模型中使用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
    ...
}

在强类型到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"]