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


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'предупреждать? Спасибо


у тебя нет 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"; } 
    }

Пожалуйста, объясните, как устанавливается Nameсвойство?
— ErikE 03

13

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

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue

5

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

ViewContext.Controller.GetType().Name

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


2

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


0

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

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

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

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.