UrlHelper.Action не отображается на область, в которой находится контроллер правильно - PullRequest
8 голосов
/ 04 августа 2010

ОБНОВЛЕНИЕ 2

Хорошо - похоже, мой вопрос снова немного меняется: -)

Теперь я понял, что UrlHelper.Action некажется, правильно разрешить URL в любой области, если имя области явно не указано.Если он не указан, он, похоже, возвращает то имя области, в которой мы находимся в данный момент, что создает впечатление, что оно работает с одной части сайта, но тогда эта же ссылка в другой области преобразуется в неправильное имя области.

Либо я сделал что-то интересное, чтобы заставить это сделать это, либо я не совсем понимаю, как этот метод действия предназначен для работы.

ОБНОВЛЕНИЕ 1

Я могусделайте эту работу, выполнив следующие действия:

return helper.Action("add", "product",new {area = "storemanagement"});

, что немного меняет мой вопрос.

Почему маршрутизация MVC не устраняет неоднозначность с одинаковыми именами контроллеров и разрешает их суказанный метод действия?

Origional post

Всем привет,

Я создал вспомогательный метод для класса UrlHelper и у меня небольшойпроблема с одним из маршрутов.

Вот код для рассматриваемого вспомогательного метода:

public static string AddProduct(this UrlHelper helper)
        {
            return helper.Action("add", "product");
        }

В основном у меня есть два контроллера с именем "product", которые находятся в разных областях сайта.,Один из них используется для просмотра продуктов, а другой - для управления продуктами.Только один из контроллеров продукта содержит метод действия «Добавить».

При выводе значения AddProduct

<%: Url.AddProduct() %>

Имя области разрешается в текущей области, которую я просматриваю ине правильная область для контроллера продукта, содержащего метод действия Add.

Что-то мне нужно настроить в маршрутах?Я не совсем уверен, как работает маршрутизация с UrlHelper.Action, поэтому я не знаю, возможно ли сделать то, что я пытаюсь.

Приветствует любую помощь.

Ответы [ 2 ]

1 голос
/ 29 сентября 2016

Просто поместите ответ в раздел ответов для ясности ...

Вам нужно будет добавить Area к RouteValues каждый раз, когда вы используете UrlHelper.Action для создания пути ссылки.

Если вы находитесь в контроллере, вы можете заглушить UrlHelper следующим образом:

var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current);
var requestContext = new RequestContext(httpContext, new RouteData());
var urlHelper = new UrlHelper(requestContext);

Вы всегда можете получить текущую область так:

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]

Наконец, при использовании UrlHelper передайте область в объекте RouteValues ​​ следующим образом:

var url = urlHelper.Action("Index", "Home", new { area = "Pages" }));
1 голос
/ 21 апреля 2013

Это поведение по умолчанию для ASP.NET Routing.

Когда в «Области» действие (и вид) ищется контроллером и именем действия в местоположениях по умолчанию. Предполагается, что представление является ActionName, если в действии не указано иное, например, return PartialView("_MyPartialView.cshtml", ViewModel)

Расположение по умолчанию: {Controller} = имя контроллера, {Area} = имя области

Контроллер:

"Areas/{Area}/{Controller}/"
"Controllers/{Controller}"

Просмотров: 1011 * *

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/"
"Views/Shared"

Если вы не укажете Район в значениях маршрута, он никогда не будет искать за пределами этих местоположений. Район совпадает с местом, куда вы звоните своему помощнику. Если вы находитесь на корневом уровне (не в области), он будет ограничен

"Controllers/{Controller}" // controller
"Views/{Controller}/" // views
"Views/Shared" // views

Проблема была в том, что когда вы где-то в одной области1 искали "Areas/Area1/{Controller}/" и когда вы были в Зоне2, он искал "Areas/Area2/{Controller}/" (И оба искали Controllers/Product и Controllers/Shared). Он был в состоянии найти его, когда вы в нужной области, потому что он соответствует местоположению поиска по умолчанию, но не в другой области, потому что контроллер находился только в одной физической области.

Добавление области, как вы это сделали, велит ей искать в предопределенной области, чтобы она шла прямо туда. "Areas/Storemanagement/Views/product/" и найдите представление, определенное в Добавить действие.

Нет смысла в том, чтобы пустой вспомогательный метод возвращал метод Url.Action, но, возможно, это было только для демонстрации.

(я только что заметил, что вопрос довольно старый, но я думаю, что это может быть здесь для дальнейшего использования)

...