Перегляньте поточний контролер


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?
— мисливець

Будь ласка, опублікуйте свою дію, methodяка завантажує partialviewі controllerщо methodіснує в.
— мисливець

Відповіді:


193

Я поставив це як часткове уявлення:

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

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

Тож використовуйте замість цього попередження:

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

25
Відповідь Palpie нижче - це (легше запам’ятати) ярлик:@ViewContext.RouteData.Values["controller"]
— Laoujin

6
Просто фій, не потрібно отримувати HttpContext.Current. Requestдоступний безпосередньо.
— Serj Sagan

Чи можна отримати повне ім'я класу контролера, включаючи простір імен? Також було б круто, щоб також можна було показати ім'я перегляду.
— Джонкл

3
btw, ["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властивість?
— ЕрікЕ


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.