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

时间:2010-10-21 21:15:05

标签: c# asp.net-mvc-2 asp.net-mvc-routing asp.net-mvc-areas

我想在HtmlHelper类中添加一个扩展方法,以便开发人员可以一次性检索AreaActionLink<T>,而无需每次都添加new { area = "MyArea" },也无需指定Controller。如果我指定命名空间或将区域控制器的命名空间放在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>);
}

如果命名空间在调用AreaActionLink

时是完全限定的,则此方法有效
namespace My.Web.Areas.MyArea.Controllers
{
    [Area("MyArea")]
    public class OtherPlaceController : Controller
    {
        //...
    }
}

并且这样调用:

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

但是如果我尝试压缩命名空间层次结构,那么我不必为任何区域添加新的命名空间,它会抛出404.

namespace My.Web.Controllers
{
    [Area("MyArea")]
    public class OtherPlaceController : Controller
    {
        //...
    }
}

似乎命名空间的.Areas部分很重要,但我无法弄明白为什么......

1 个答案:

答案 0 :(得分:1)

我确信您已经习惯了,默认情况下,ASP.NET MVC 非常依赖于目录结构(控制器需要位于“Controllers”文件夹中,“视图”中的视图“等等。这更像是一样的。您的区域位于不同的文件夹中 - 这实际上是拥有它们的主要原因之一! :)