Respostas:
Use ViewContext
e veja a RouteData
coleção para extrair os elementos do controlador e da ação. Mas acho que definir algumas variáveis de dados que indicam o contexto do aplicativo (por exemplo, "modo de edição" ou "erro") em vez de controlador / ação reduz o acoplamento entre suas visualizações e controladores.
No RC, você também pode extrair dados da rota como o nome do método de ação como este
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
+ variações
Para obter o ID atual em uma Visualização:
ViewContext.RouteData.Values["id"].ToString()
Para obter o controlador atual:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
primeiro.
Sei que essa é uma pergunta mais antiga, mas eu a vi e pensei que você poderia estar interessado em uma versão alternativa do que permitir que sua visualização lide com a recuperação dos dados necessários para seu trabalho.
Uma maneira mais fácil, na minha opinião, seria substituir o método OnActionExecuting . Você recebe o ActionExecutingContext que contém o membro ActionDescriptor que você pode usar para obter as informações que procura, que é o ActionName e também é possível acessar o ControllerDescriptor e o 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.
}
Espero que isto ajude. Se alguma coisa, pelo menos, mostrará uma alternativa para qualquer outra pessoa que vier com sua pergunta.
Vi respostas diferentes e criei um ajudante 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;
}
}
}
Portanto, no modo de exibição (ou mestre / layout), você pode usá-lo da seguinte maneira (sintaxe do 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>
Espero que ajude.
Você pode obter esses dados do RouteData de um ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
No MVC, você deve fornecer ao View todos os dados, não permitir que o View colete seus próprios dados, para que você possa definir a classe CSS na ação do seu controlador.
ViewData["CssClass"] = "bold";
e escolha esse valor no seu ViewData no seu View
Eu voto para este 2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
e
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Você pode recuperar o nome físico da visualização atual e a ação que a acionou. Pode ser útil em páginas * .acmx parciais para determinar o contêiner do host.
Estendendo a resposta de Dale Ragan , seu exemplo para reutilização, crie uma classe ApplicationController que deriva do Controller e, por sua vez, todos os outros controladores derivam dessa classe ApplicationController em vez de Controller.
Exemplo:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
No seu novo ApplicationController, crie uma propriedade chamada ExecutingAction com esta assinatura:
protected ActionDescriptor ExecutingAction { get; set; }
E então, no método OnActionExecuting (da resposta de Dale Ragan), simplesmente atribua o ActionDescriptor a essa propriedade e você poderá acessá-lo sempre que precisar em qualquer um dos seus controladores.
string currentActionName = this.ExecutingAction.ActionName;
Substitua esta função no seu controlador
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}