Réponses:
Utilisez le ViewContext
et regardez la RouteData
collection pour extraire à la fois le contrôleur et les éléments d'action. Mais je pense que la définition d'une variable de données qui indique le contexte de l'application (par exemple, "mode d'édition" ou "erreur") plutôt que contrôleur / action réduit le couplage entre vos vues et les contrôleurs.
Dans le RC, vous pouvez également extraire des données d'itinéraire comme le nom de la méthode d'action comme ceci
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
+ variations
Pour obtenir l'ID actuel sur une vue:
ViewContext.RouteData.Values["id"].ToString()
Pour obtenir le contrôleur actuel:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
premier.
Je sais que c'est une question plus ancienne, mais je l'ai vue et j'ai pensé que vous pourriez être intéressé par une version alternative que de laisser votre vue gérer la récupération des données dont elle a besoin pour faire son travail.
Un moyen plus simple à mon avis serait de remplacer la méthode OnActionExecuting . Vous passez le ActionExecutingContext qui contient le membre ActionDescriptor que vous pouvez utiliser pour obtenir les informations que vous recherchez, qui est le ActionName et vous pouvez également atteindre le ControllerDescriptor et il contient le 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.
}
J'espère que cela t'aides. Si quoi que ce soit, au moins cela montrera une alternative pour toute autre personne qui vient par votre question.
J'ai vu différentes réponses et j'ai trouvé un assistant de classe:
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;
}
}
}
Donc, dans View (ou master / layout), vous pouvez l'utiliser comme ça (syntaxe 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>
J'espère que ça aide.
Vous pouvez obtenir ces données de RouteData d'un ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
Dans MVC, vous devez fournir à la vue toutes les données, ne pas laisser la vue collecter ses propres données, vous pouvez donc définir la classe CSS dans l'action de votre contrôleur.
ViewData["CssClass"] = "bold";
et sélectionnez cette valeur de vos ViewData dans votre vue
Je vote pour ce 2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
et
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Vous pouvez récupérer le nom physique de la vue actuelle et l'action qui l'a déclenchée. Il peut être utile dans les pages partielles * .acmx pour déterminer le conteneur hôte.
Prolonger la réponse de Dale Ragan , son exemple de réutilisation, créez une classe ApplicationController qui dérive de Controller, et à votre tour, tous vos autres contrôleurs dérivent de cette classe ApplicationController plutôt que Controller.
Exemple:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
Sur votre nouveau ApplicationController, créez une propriété nommée ExecutingAction avec cette signature:
protected ActionDescriptor ExecutingAction { get; set; }
Et puis dans la méthode OnActionExecuting (d'après la réponse de Dale Ragan), affectez simplement l'ActionDescriptor à cette propriété et vous pouvez y accéder chaque fois que vous en avez besoin dans l'un de vos contrôleurs.
string currentActionName = this.ExecutingAction.ActionName;
Remplacez cette fonction dans votre contrôleur
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}