2

我正在尝试使用 MVC Futures 库中强类型的 Html.RenderAction

我试图从我的 Site.Master 调用我的主 HomeController (area = "") 上的导航操作

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

在我将另一个 HomeController 添加到我的 Admin 便携式区域之前,这非常有效。然后我开始出现以下错误:

找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由。

'Home' 的请求找到了以下匹配的控制器:Areas.Admin.Controllers.HomeController Web.Controllers.HomeController

我能够通过使用以下非 mvccontrib 强类型 RenderAction 方法解决该问题。我宁愿在页面上没有这个非强类型方法,有没有办法让 mvccontrib 方法接受一个区域,或者让他们知道根据指定的控制器的路由或命名空间生成区域。

<% Html.RenderAction("Navigation", "Home", new { area = "" }); %>

我已经添加到我的 global.asax.cs 文件中,以支持具有如下所示默认区域的多个控制器,并且我还验证了这是我的控制器的正确命名空间。

_routeCollection.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "Web.Controllers" });
4

2 回答 2

2

显然,此时的期货项目不支持此功能,或者他们从 Futures v1.0 开始对其进行了更改。我使用反射器对futures库进行了反汇编,找到了RenderAction方法的源代码,并对其进行了修改,以从Controller的命名空间中解析出区域,并在处理之前将其添加到RouteValues中。我假设如果我希望它们以相同的方式运行,我可能也必须为 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);
}
于 2011-07-08T11:35:35.167 回答
0

为了在 MVC 中支持多个控制器,您需要将命名空间添加到默认路由。

有关更多详细信息,请参阅此答案:问题 2627699

于 2011-07-06T14:26:49.847 回答