Yanıtlar:
Hem denetleyiciyi hem de eylem öğelerini çıkarmak ViewContext
için RouteData
koleksiyonu kullanın ve bakın . Ancak, denetleyici / eylem yerine uygulama bağlamını (örneğin, "düzenleme modu" veya "hata") belirten bazı veri değişkenleri ayarlamanın, görünümleriniz ve denetleyiciler arasındaki bağlantıyı azalttığını düşünüyorum.
RC'de ayrıca, böyle işlem yöntemi adı gibi rota verilerini de çıkarabilirsiniz
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
+ varyasyonları
Geçerli Kimliği bir Görünümde almak için:
ViewContext.RouteData.Values["id"].ToString()
Geçerli denetleyiciyi almak için:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
önce kontrol edin .
Bunun daha eski bir soru olduğunu biliyorum, ama gördüm ve görüşünüzün işini yapması için gereken verileri almasına izin vermekten daha alternatif bir versiyonla ilgilenebileceğinizi düşündüm.
Bence daha kolay bir yol OnActionExecuting yöntemini geçersiz kılmak olacaktır . Aradığınız bilgileri elde etmek için kullanabileceğiniz ActionDescriptor üyesini içeren ActionExecutingContext iletilir , bu işlem ActionName'dir ve ControllerDescriptor'a da erişebilirsiniz ve ControllerName'i de içerir.
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.
}
Bu yardımcı olur umarım. Herhangi bir şey varsa, en azından sorunuz tarafından gelen herkes için bir alternatif gösterecektir.
Farklı cevaplar gördüm ve bir sınıf yardımcısı buldum:
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;
}
}
}
Böylece, Görünümde (veya ana / mizanpajda) şöyle kullanabilirsiniz (Jilet sözdizimi):
<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>
Umarım yardımcı olur.
Bu verileri bir ViewContext'in RouteData öğesinden alabilirsiniz.
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
MVC'de View'e tüm verileri sağlamanız gerekir, View'un kendi verilerini toplamasına izin vermeyin, böylece yapabileceğiniz şey CSS sınıfını denetleyici eyleminizde ayarlamaktır.
ViewData["CssClass"] = "bold";
ve Görünümünüzdeki ViewData öğenizden bu değeri seçin
Bu 2'ye oy verdim:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
ve
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Geçerli görünümün fiziksel adını ve onu tetikleyen eylemi kaldırabilirsiniz. Ana bilgisayar kapsayıcısını belirlemek için kısmi * .acmx sayfalarında yararlı olabilir.
Dale Ragan'ın yeniden kullanım örneği cevabını genişletmek , Controller'dan türeyen bir ApplicationController sınıfı oluşturur ve diğer tüm denetleyicilerinizin Controller yerine bu ApplicationController sınıfından türetilmesini sağlar.
Misal:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
Yeni ApplicationController'ınızda bu imzayla ExecutingAction adlı bir özellik oluşturun:
protected ActionDescriptor ExecutingAction { get; set; }
Ve sonra OnActionExecuting yönteminde (Dale Ragan'ın cevabından), bu özelliğe ActionDescriptor atayın ve denetleyicilerinizden herhangi birinde ihtiyacınız olduğunda ona erişebilirsiniz.
string currentActionName = this.ExecutingAction.ActionName;
Oyun kumandanızda bu işlevi geçersiz kıl
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}