जवाबों:
नियंत्रक और एक्शन तत्वों दोनों को निकालने के ViewContext
लिए RouteData
संग्रह का उपयोग करें और देखें । लेकिन मुझे लगता है कि कंट्रोलर / एक्शन के बजाय कुछ डेटा वैरिएबल सेट करना जो एप्लिकेशन संदर्भ (जैसे, "एडिटमोड" या "एरर") को इंगित करता है, आपके विचारों और नियंत्रकों के बीच युग्मन को कम करता है।
आरसी में आप एक्शन विधि नाम की तरह रूट डेटा भी निकाल सकते हैं
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 है और आप नियंत्रक Descriptor तक भी पहुँच सकते हैं और इसमें नियंत्रक नाम शामिल है।
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;
}
}
}
तो व्यू (या मास्टर / लेआउट) में आप इसका उपयोग कर सकते हैं जैसे (रेजर सिंटैक्स):
<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>
आशा करता हूँ की ये काम करेगा।
आप इन डेटा को एक ViewContext के रूटडेटा से प्राप्त कर सकते हैं
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
MVC में आपको सभी डेटा के साथ व्यू प्रदान करना चाहिए, व्यू को अपना डेटा इकट्ठा नहीं करने देना चाहिए ताकि आप अपने नियंत्रक कार्रवाई में सीएसएस वर्ग को सेट कर सकें।
ViewData["CssClass"] = "bold";
और अपने दृश्य में अपने ViewData से इस मान को बाहर निकालें
मैं इस 2 के लिए वोट:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
तथा
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
आप वर्तमान दृश्य और क्रिया के भौतिक नाम दोनों को पुनः प्राप्त कर सकते हैं जिसने इसे ट्रिगर किया है। यह मेजबान कंटेनर को निर्धारित करने के लिए आंशिक * .acmx पृष्ठों में उपयोगी हो सकता है।
विस्तार डेल Ragan के जवाब , पुन: उपयोग के लिए उनका उदाहरण, एक एप्लिकेशनकंट्रोलर वर्ग बनाएं जो नियंत्रक से प्राप्त होता है, और बदले में आपके सभी अन्य नियंत्रक नियंत्रक के बजाय उस ApplicationController वर्ग से प्राप्त होते हैं।
उदाहरण:
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);
}