【问题标题】:AreaActionLink Extension Method and namespace bug?AreaActionLink 扩展方法和命名空间错误?
【发布时间】:2010-10-21 21:15:05
【问题描述】:

我想为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 部分很重要,但我不知道为什么...

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我的区域位于根目录的子文件夹中,但我试图获取平面命名空间,以便在调用我的扩展方法时不必完全限定命名空间或必须添加每个新的web.config 的区域。我想这是一次性的,所以它不是糟糕。
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2010-11-06
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多