2010-10-21 51 views
0

我想向HtmlHelper類添加擴展方法,以便開發人員可以一般地檢索和AreaActionLink<T>而不必每次都添加new { area = "MyArea" }以及不必指定Controller。如果我指定命名空間或將Area Controller的命名空間放在Web.config中,這一切都可以正常運行。AreaActionLink擴展方法和名稱空間錯誤?

例如,如果我將區域控制器命名空間更改爲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

正如我敢肯定,你已經成爲習慣,默認情況下ASP.NET MVC是很大程度上依賴於目錄結構(控制器需要位於「控制器」文件夾中,「視圖」中的視圖等)。這僅僅是相同的。您的區域應該位於單獨的文件夾中 - 這實際上是讓他們擁有它們的主要原因之一! :)

+0

是的,我的區域位於從根目錄的子文件夾中,但我試圖獲得平面命名空間,以便在調用我的擴展方法時不必完全限定命名空間,或者必須將每個新區域添加到web.config中。我想這是一次性的事情,所以它不會太壞。 – hunter 2010-10-22 13:04:30