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


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.