C# AreaActionLink扩展方法和命名空间错误?

C# AreaActionLink扩展方法和命名空间错误?,c#,asp.net-mvc-2,asp.net-mvc-routing,asp.net-mvc-areas,C#,Asp.net Mvc 2,Asp.net Mvc Routing,Asp.net Mvc Areas,我想向HtmlHelper类添加一个扩展方法,这样开发人员就可以一般地检索和AreaActionLink,而无需每次添加新的{area=“MyArea”},也无需指定控制器。如果我指定名称空间或将区域控制器的名称空间放在Web.config中,这一切都很好 例如,如果我将区域控制器名称空间更改为My.Web.Controllers而不是My.Web.MyArea.Controllers,它会抛出404,但如果我正确使用名称空间,它会正确解析 public static MvcHtmlString

我想向
HtmlHelper
类添加一个扩展方法,这样开发人员就可以一般地检索和
AreaActionLink
,而无需每次添加
新的{area=“MyArea”}
,也无需指定
控制器。如果我指定名称空间或将区域控制器的名称空间放在Web.config中,这一切都很好

例如,如果我将区域控制器名称空间更改为
My.Web.Controllers
而不是
My.Web.MyArea.Controllers
,它会抛出404,但如果我正确使用名称空间,它会正确解析

public static MvcHtmlString AreaActionLink<T>(this HtmlHelper helper, string linkText, string actionName, object routeValues, object htmlAttributes) where T : IController
{
    RouteValueDictionary routes = new RouteValueDictionary(routeValues);
    string area = typeof(T).GetArea();
    if (!routes.ContainsKey("area"))
        routes.Add("area", area);

    return helper.ActionLink(linkText, 
        actionName, 
        typeof(T).Name.Replace("Controller", string.Empty), 
        routes, 
        htmlAttributes as Dictionary<string, object>);
}
并这样称呼:

<%=Html.AreaActionLink<OtherPlaceController>("Link Text", "MyAction")%>

名称空间的
.Areas
部分似乎很重要,但我不明白为什么…

我相信您已经习惯了,默认情况下ASP.NET MVC非常依赖于目录结构(控制器需要在“控制器”文件夹中,视图在“视图”中,等等)。这与此基本相同。您的区域应该位于单独的文件夹中——这实际上是拥有它们的主要原因之一!)

是的,我的区域位于根目录下的子文件夹中,但我尝试获取平面名称空间,这样在调用扩展方法时就不必完全限定名称空间,也不必将每个新区域添加到web.config。我想这是一次性的,所以还不算太糟。
<%=Html.AreaActionLink<OtherPlaceController>("Link Text", "MyAction")%>
namespace My.Web.Controllers
{
    [Area("MyArea")]
    public class OtherPlaceController : Controller
    {
        //...
    }
}