Відповіді:
Використовуйте колекцію ViewContext
та перегляньте RouteData
колекцію, щоб витягти як контролер, так і елементи дії. Але я думаю, що встановлення певної змінної даних, яка вказує на контекст програми (наприклад, "editmode" або "помилка"), а не контролер / дія, зменшує зв'язок між вашими переглядами та контролерами.
У RC ви також можете витягти дані маршруту, такі як назва методу дії, як це
ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue
ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
+ варіації
Щоб отримати поточний ідентифікатор на перегляді:
ViewContext.RouteData.Values["id"].ToString()
Щоб отримати поточний контролер:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
спочатку.
Я знаю, що це питання старіше, але я це побачив, і я подумав, що вас може зацікавити альтернативна версія, ніж дозволяти вашому огляду обробляти дані, необхідні для його виконання.
На мій погляд, простішим способом було б перекриття методу OnActionExecuting . Вам передається ActionExecutingContext, який містить члена ActionDescriptor, який ви можете використовувати для отримання потрібної інформації, яка є іменем ActionName, і ви також можете дістатися до ControllerDescriptor, і він містить ім'я ControllerName.
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
ActionDescriptor actionDescriptor = filterContext.ActionDescriptor;
string actionName = actionDescriptor.ActionName;
string controllerName = actionDescriptor.ControllerDescriptor.ControllerName;
// Now that you have the values, set them somewhere and pass them down with your ViewModel
// This will keep your view cleaner and the controller will take care of everything that the view needs to do it's job.
}
Сподіваюсь, це допомагає. Якщо що-небудь, принаймні, це покаже альтернативу для будь-кого іншого, що стосується вашого питання.
Я побачив різні відповіді і придумав класного помічника:
using System;
using System.Web.Mvc;
namespace MyMvcApp.Helpers {
public class LocationHelper {
public static bool IsCurrentControllerAndAction(string controllerName, string actionName, ViewContext viewContext) {
bool result = false;
string normalizedControllerName = controllerName.EndsWith("Controller") ? controllerName : String.Format("{0}Controller", controllerName);
if(viewContext == null) return false;
if(String.IsNullOrEmpty(actionName)) return false;
if (viewContext.Controller.GetType().Name.Equals(normalizedControllerName, StringComparison.InvariantCultureIgnoreCase) &&
viewContext.Controller.ValueProvider.GetValue("action").AttemptedValue.Equals(actionName, StringComparison.InvariantCultureIgnoreCase)) {
result = true;
}
return result;
}
}
}
Тож у View (або master / layout) ви можете використовувати його так (синтаксис Razor):
<div id="menucontainer">
<ul id="menu">
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home", "index", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Home", "Index", "Home")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("account","logon", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Logon", "Logon", "Account")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home","about", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("About", "About", "Home")</li>
</ul>
</div>
Сподіваюся, це допомагає.
Ви можете отримати ці дані з RouteData ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
У MVC ви повинні надавати Перегляду всі дані, а не дозволяти Перегляду збирати власні дані, тому ви можете встановити клас CSS у дії контролера.
ViewData["CssClass"] = "bold";
і виберіть це значення у ViewData у своєму представленні
Я голосую за це 2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
і
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Ви можете отримати як фізичну назву поточного перегляду, так і дію, яка її викликала. Визначити контейнер хоста може бути корисним на часткових * .acmx сторінках.
Розширюючи відповідь Дейла Рагана , його приклад для повторного використання, створіть клас ApplicationController, який походить від Controller, і, в свою чергу, всі ваші інші контролери виходять із цього класу ApplicationController, а не Controller.
Приклад:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
У новому ApplicationController створіть властивість під назвою ExecutingAction з цим підписом:
protected ActionDescriptor ExecutingAction { get; set; }
А потім у методі OnActionExecuting (з відповіді Дейла Рагана) просто призначте ActionDescriptor цій властивості, і ви можете отримати доступ до неї, коли вам це потрібно, у будь-якому з ваших контролерів.
string currentActionName = this.ExecutingAction.ActionName;
Замініть цю функцію у контролері
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}