Я хотел добавить метод расширения к классу 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
часть пространства имен важна, но я не могу понять, почему ...