Asp.net mvc MVC未来的强类型渲染具有区域和重复的控制器名称

Asp.net mvc MVC未来的强类型渲染具有区域和重复的控制器名称,asp.net-mvc,asp.net-mvc-areas,asp.net-mvc-futures,Asp.net Mvc,Asp.net Mvc Areas,Asp.net Mvc Futures,我试图使用MVC Futures库中强类型的Html.RenderAction 我试图从我的站点调用主HomeController(area=”“)上的导航操作。Master <% Html.RenderAction<HomeController>(x=>x.Navigation()); %> 为了支持MVC中的多个控制器,您需要向默认路由添加名称空间 有关更多详细信息,请参见此答案:显然,futures项目目前不支持此功能,或者futures v1.0版之后他们

我试图使用MVC Futures库中强类型的Html.RenderAction

我试图从我的站点调用主HomeController(area=”“)上的导航操作。Master

<% Html.RenderAction<HomeController>(x=>x.Navigation()); %>

为了支持MVC中的多个控制器,您需要向默认路由添加名称空间


有关更多详细信息,请参见此答案:

显然,futures项目目前不支持此功能,或者futures v1.0版之后他们对其进行了更改。我使用reflector反汇编futures库,找到RenderAction方法的源代码,并对其进行修改,以将该区域从控制器的命名空间中解析出来,并在其处理之前将其添加到RouteValue中。我假设如果我想让ActionLink以同样的方式运行,我可能也必须为ActionLink做类似的事情

下面是我使用的代码示例,希望这能在将来帮助其他人。我可能会创建新的方法,指示它将解析这些区域,而不是像我到目前为止所做的那样重载

public static void RenderAction<TController>(this HtmlHelper helper, Expression<Action<TController>> action) where TController : Controller
{
    var ctrlNamespace = typeof(TController).Namespace;

    int areaStart = ctrlNamespace.IndexOf(".Areas.");
    if (areaStart > -1) 
    {
        ctrlNamespace = ctrlNamespace.Substring(areaStart + 7);
        int areaEnd = ctrlNamespace.IndexOf(".");
        ctrlNamespace = ctrlNamespace.Substring(0, areaEnd);
    }
    else
    {
        ctrlNamespace = String.Empty; //default area
    }

    helper.ViewContext.RouteData.Values.Add("area", ctrlNamespace);

    RouteValueDictionary routeValuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression<TController>(action);
    foreach (KeyValuePair<string, object> pair in helper.ViewContext.RouteData.Values)
    {
        if (!routeValuesFromExpression.ContainsKey(pair.Key))
        {
            routeValuesFromExpression.Add(pair.Key, pair.Value);
        }
    }

    helper.RenderRoute(routeValuesFromExpression);
}
publicstaticvoidrenderAction(此HtmlHelper帮助程序,表达式操作),其中TController:Controller
{
var ctrlNamespace=typeof(TController).Namespace;
int-areaStart=ctrlNamespace.IndexOf(“.Areas”);
如果(区域开始>-1)
{
ctrlNamespace=ctrlNamespace.Substring(areaStart+7);
int areaEnd=ctrlNamespace.IndexOf(“.”);
ctrlNamespace=ctrlNamespace.Substring(0,areaEnd);
}
其他的
{
ctrlNamespace=String.Empty;//默认区域
}
helper.ViewContext.RouteData.Values.Add(“area”,ctrlNamespace);
RouteValueDictionary RouteValuesFromeExpression=ExpressionHelper.GetRouteValuesFromeExpression(操作);
foreach(helper.ViewContext.RoutedData.Values中的KeyValuePair对)
{
如果(!routeValuesFromExpression.ContainsKey(对键))
{
RouteValuesFroExpression.Add(pair.Key,pair.Value);
}
}
RenderRoute(RouteValuesFroExpression);
}

我已经这样做了,我应该在我原来的帖子中指出这一点。我在我的global.asax.cs_routeCollection.MapRoute(“Default”、“{controller}/{action}/{id}”、new{controller=“Home”、action=“Index”、id=UrlParameter.Optional}、new[]{“Web.Controllers”})中有这个选项;
_routeCollection.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "Web.Controllers" });
public static void RenderAction<TController>(this HtmlHelper helper, Expression<Action<TController>> action) where TController : Controller
{
    var ctrlNamespace = typeof(TController).Namespace;

    int areaStart = ctrlNamespace.IndexOf(".Areas.");
    if (areaStart > -1) 
    {
        ctrlNamespace = ctrlNamespace.Substring(areaStart + 7);
        int areaEnd = ctrlNamespace.IndexOf(".");
        ctrlNamespace = ctrlNamespace.Substring(0, areaEnd);
    }
    else
    {
        ctrlNamespace = String.Empty; //default area
    }

    helper.ViewContext.RouteData.Values.Add("area", ctrlNamespace);

    RouteValueDictionary routeValuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression<TController>(action);
    foreach (KeyValuePair<string, object> pair in helper.ViewContext.RouteData.Values)
    {
        if (!routeValuesFromExpression.ContainsKey(pair.Key))
        {
            routeValuesFromExpression.Add(pair.Key, pair.Value);
        }
    }

    helper.RenderRoute(routeValuesFromExpression);
}