Получить текущий контроллер в поле зрения

127

У меня есть в View - _Editкотором живет News M/V/C.

Я повторно использую переходное V/Mотверстие CategoryControllerкак:

return PartialView("/Views/News/_Edit.cshtml", model);

Как изнутри View - _Editя могу предупредить имя контроллера?

Когда я:

alert('@ViewContext. RouteData.Values["controller"].ToString()');

Значение: News Однако URL-адрес:/Category/foobar

Есть ли способ заставить значение 'Category'предупреждать? Спасибо

Valamas
источник
у тебя нет NewsController?
hunter
Пожалуйста , ваши действия method, загружающие partialviewи что , controllerчто methodсуществует в.
охотник

Ответы:

193

Я изложил это в своем частичном представлении:

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()

в той же ситуации, которую вы описываете, и он показывает контроллер, описанный в URL-адресе (Категория для вас, Продукт для меня), вместо фактического местоположения частичного представления.

Поэтому используйте вместо этого это предупреждение:

alert('@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()');
Николас Сайзер
источник
25
Ответ Палпи ниже - это (легче запомнить) ярлык:@ViewContext.RouteData.Values["controller"]
Лауджин,
6
Просто fyi, вам не нужно получать HttpContext.Current. Requestдоступен напрямую.
Серж Саган
Можно ли получить полное имя класса контроллера, включая пространство имен? Также было бы здорово иметь возможность отображать имя представления.
Johncl
3
кстати, ["action"]работает, если вам нужно имя метода действия.
Zapnologica
117

Я так делаю, но, возможно, это только ASP.NET MVC 4

@ViewContext.RouteData.Values["controller"]
Питер Хедберг
источник
12
Имейте в виду, что ваше решение вернет контроллер, который в настоящее время выполняется. Следовательно, если браузер делает запрос для ControllerA, а ControllerA отображает частичное представление из ControllerB, ваше решение вернет имя ControllerB, а решение Nicholas Sizer вернет имя ControllerA.
Thomas CG de Vilhena
Следует принять как лучший ответ. Это все еще работает в ASP.NET Core 2.2
Том
21

Создайте базовый класс для всех контроллеров и поместите сюда атрибут name:

public abstract class MyBaseController : Controller
{
    public abstract string Name { get; }
}

Ввиду

@{
    var controller = ViewContext.Controller as MyBaseController;
    if (controller != null)
    {
       @controller.Name
    }
}

Пример контроллера

 public class SampleController: MyBaseController 
    { 
      public override string Name { get { return "Sample"; } 
    }
Sel
источник
Пожалуйста, объясните, как устанавливается Nameсвойство?
ErikE 03
13

Другой способ получить текущее имя контроллера в представлении

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Владимир Савинов
источник
5

Просто используйте:

ViewContext.Controller.GetType().Name

Это даст вам полное имя контроллера

batspy
источник
2

Вы все еще находитесь в контексте своего, CategoryControllerхотя загружаете PartialViewфайл из своей Views/Newsпапки.

охотник
источник
0

Вы можете использовать любой из приведенных ниже кодов, чтобы получить имя контроллера.

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

Если вы используете MVC 3, вы можете использовать

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Sathish
источник