Метод расширения AreaActionLink и ошибка пространства имен? - PullRequest
0 голосов
/ 22 октября 2010

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

1 голос
/ 22 октября 2010

Как я уверен, вы уже привыкли, что по умолчанию ASP.NET MVC очень сильно зависит от структуры каталогов (контроллеры должны находиться в папке "Controllers", представления в "Views" и т. д.) Это просто больше того же самого. Ваши области должны находиться в отдельных папках - это одна из главных причин их наличия! :)

...