Je voulais créer une classe CSS dans ma page principale, qui dépend du régulateur de courant et l’action. Je peux obtenir l’actuel contrôleur via , mais comment faire l’action en cours (par exemple
, `` etc..) ?
Réponses
Trop de publicités?Utilisez le ViewContext et regarder la collection RouteData pour extraire le contrôleur et l’action des éléments. Mais je pense que définir une variable de données qui indique le contexte de l’application (par exemple, « editmode » ou « error ») plutôt que de contrôleur/action réduit le couplage entre vos vues et contrôleurs.
Je sais que c'est une vieille question, mais je l'ai vu et j'ai pensé que vous pourriez être intéressé par une version alternative que de laisser votre point de vue poignée de récupérer les données dont il a besoin pour faire son travail.
Un moyen plus simple à mon avis serait de remplacer la OnActionExecuting méthode. Vous êtes passé le ActionExecutingContext qui contient le ActionDescriptor membre que vous pouvez utiliser pour obtenir les informations que vous recherchez, qui est le ActionName et vous pouvez également rejoindre la ControllerDescriptor et il contient la 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.
}
Espérons que cette aide. Si quoi que ce soit, à moins qu'il apparaîtra une alternative pour quelqu'un d'autre qui vient par votre question.
J'ai vu différentes réponses et j'ai trouvé une aide 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 cela aide.