दृश्य या नियंत्रक में आपको वर्तमान क्षेत्र का नाम कैसे मिलता है?
क्या ViewContext.RouteData.Values["controller"]
क्षेत्रों के लिए ऐसा कुछ है ?
दृश्य या नियंत्रक में आपको वर्तमान क्षेत्र का नाम कैसे मिलता है?
क्या ViewContext.RouteData.Values["controller"]
क्षेत्रों के लिए ऐसा कुछ है ?
जवाबों:
MVC2 के बाद से आप उपयोग कर सकते हैं ViewContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0
बजाय इसे बुलाया जाता है MVC6
.. :-)
आप इसे कंट्रोलर का उपयोग करके प्राप्त कर सकते हैं:
ControllerContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0 में मान पाया जाता है
ViewContext.RouteData.Values [ "क्षेत्र"];
pageModel.RouteData.Values.TryGetValue("area", out object area)
इसके बजाय इसका इस्तेमाल किया जाना चाहिए)
मैंने अभी इस बारे में ab log प्रविष्टि लिखी है , आप अधिक विवरण के लिए उस पर जा सकते हैं, लेकिन मेरा उत्तर एक्सटेंशन विधि बनाने के लिए था, जो नीचे दिखाया गया है।
प्रमुख किकर यह था कि आप MVC एरिया को .DataTokens से और कंट्रोलर / एक्शन को रूटडेटा से खींचते हैं।
public static MvcHtmlString TopMenuLink(this HtmlHelper htmlHelper, string linkText, string controller, string action, string area, string anchorTitle)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action(action, controller, new { @area = area });
var anchor = new TagBuilder("a");
anchor.InnerHtml = HttpUtility.HtmlEncode(linkText);
anchor.MergeAttribute("href", url);
anchor.Attributes.Add("title", anchorTitle);
var listItem = new TagBuilder("li");
listItem.InnerHtml = anchor.ToString(TagRenderMode.Normal);
if (CheckForActiveItem(htmlHelper, controller, action, area))
listItem.GenerateId("menu_active");
return MvcHtmlString.Create(listItem.ToString(TagRenderMode.Normal));
}
private static bool CheckForActiveItem(HtmlHelper htmlHelper, string controller, string action, string area)
{
if (!CheckIfTokenMatches(htmlHelper, area, "area"))
return false;
if (!CheckIfValueMatches(htmlHelper, controller, "controller"))
return false;
return CheckIfValueMatches(htmlHelper, action, "action");
}
private static bool CheckIfValueMatches(HtmlHelper htmlHelper, string item, string dataToken)
{
var routeData = (string)htmlHelper.ViewContext.RouteData.Values[dataToken];
if (routeData == null) return string.IsNullOrEmpty(item);
return routeData == item;
}
private static bool CheckIfTokenMatches(HtmlHelper htmlHelper, string item, string dataToken)
{
var routeData = (string)htmlHelper.ViewContext.RouteData.DataTokens[dataToken];
if (dataToken == "action" && item == "Index" && string.IsNullOrEmpty(routeData))
return true;
if (dataToken == "controller" && item == "Home" && string.IsNullOrEmpty(routeData))
return true;
if (routeData == null) return string.IsNullOrEmpty(item);
return routeData == item;
}
तो आप इसे नीचे के रूप में लागू कर सकते हैं:
<ul id="menu">
@Html.TopMenuLink("Dashboard", "Home", "Index", "", "Click here for the dashboard.")
@Html.TopMenuLink("Courses", "Home", "Index", "Courses", "List of our Courses.")
</ul>
area
टोकन नहीं मिल रहा है, Values
लेकिन देखने के लिए आवश्यक है DataTokens
... पता नहीं क्यों।
मैंने RouteData
वर्तमान क्षेत्र के नाम को वापस करने के लिए एक एक्सटेंशन विधि बनाई ।
public static string GetAreaName(this RouteData routeData)
{
object area;
if (routeData.DataTokens.TryGetValue("area", out area))
{
return area as string;
}
return null;
}
चूंकि RouteData
दोनों पर उपलब्ध है ControllerContext
और ViewContext
इसे आपके नियंत्रक और विचारों में एक्सेस किया जा सकता है।
यह परीक्षण करना भी बहुत आसान है:
[TestFixture]
public class RouteDataExtensionsTests
{
[Test]
public void GetAreaName_should_return_area_name()
{
var routeData = new RouteData();
routeData.DataTokens.Add("area", "Admin");
routeData.GetAreaName().ShouldEqual("Admin");
}
[Test]
public void GetAreaName_should_return_null_when_not_set()
{
var routeData = new RouteData();
routeData.GetAreaName().ShouldBeNull();
}
}
यह जाँचने की आवश्यकता नहीं है कि RouteData.DataTokens
यह हमेशा आंतरिक रूप से आरंभिक है या नहीं।
MVC फ्यूचर्स में एक AreaHelpers.GetAreaName () विधि है। हालाँकि, यदि आप इस विधि का उपयोग कर रहे हैं तो सावधानी बरतें। अपने आवेदन के बारे में रनटाइम निर्णय लेने के लिए वर्तमान क्षेत्र का उपयोग करना मुश्किल-से-डिबग या असुरक्षित कोड हो सकता है।
this.GetName()
लिए और वर्तमान विधि के उपयोग के लिएMethodBase.GetCurrentMethod().Name
मुझे पता है कि यह पुराना है, लेकिन यह भी, जब एक्शनफ़िल्टर जैसे फ़िल्टर में, संदर्भ आपको आसानी से क्षेत्र की जानकारी प्रदान नहीं करता है।
यह निम्नलिखित कोड में पाया जा सकता है:
var routeData = filterContext.RequestContext.RouteData;
if (routeData.DataTokens["area"] != null)
area = routeData.DataTokens["area"].ToString();
इसलिए FilterContext को ओवरराइड पर पास किया जा रहा है और RequestContext के तहत सही रूटडेटा पाया जाता है। बेस स्तर पर एक रूटडैटा है, लेकिन डेटाकोन्स डीओ में इसका क्षेत्र नहीं है।
मुझे पता है कि यह एक बहुत पुरानी पोस्ट है, लेकिन हम वैल्यूज़ प्रॉपर्टी का ठीक उसी तरह से उपयोग कर सकते हैं, जैसे कि डेटाटैक्स
Url.RequestContext.RouteData.Values ["कार्रवाई"] ने मेरे लिए काम किया।
मुझे नहीं पता कि क्यों, लेकिन स्वीकृत उत्तर काम नहीं कर रहा है। यह उदाहरण के साथ अशक्त देता है (शायद mvc के बारे में, मैं .net कोर का उपयोग करता हूं)
मैं हमेशा चर को डीबग करता हूं और उसमें से डेटा प्राप्त करता हूं।
इसे इस्तेमाल करे। इससे मेरा काम बनता है
var area = ViewContext.RouteData.Values["area"]
विस्तृत तार्किक उदाहरण
Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";