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