दृश्य या नियंत्रक में वर्तमान क्षेत्र का नाम प्राप्त करें


126

दृश्य या नियंत्रक में आपको वर्तमान क्षेत्र का नाम कैसे मिलता है?

क्या ViewContext.RouteData.Values["controller"]क्षेत्रों के लिए ऐसा कुछ है ?

जवाबों:


217

MVC2 के बाद से आप उपयोग कर सकते हैं ViewContext.RouteData.DataTokens["area"]


22
यदि किसी क्षेत्र में नहीं है, तो ViewContext.RouteData.DataTokens ["area"] == नल।
user202448

23
... और MVC5 में :)
स्टीफन

4
लोल .. मजाक आप पर है @ डांटे ... अच्छी तरह से निष्पक्ष होने के ASP.NET Core 1.0बजाय इसे बुलाया जाता है MVC6.. :-)
रोजी कासिम

FYI करें - पता लगा कि मेरे अजाक्स के साथ क्या गलत था POST काम नहीं कर रहा था ... कृपया जाँचें उर ajax अनुरोधों का URL में क्षेत्र है ... वे अभी भी मिल सकते हैं !!! दृश्य, लेकिन वे अभ्यस्त क्षेत्र को बनाए नहीं रखते हैं ... यदि अनुरोध किए जाने पर url उस क्षेत्र को याद नहीं कर रहा है।
सीबकिट

43
HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"]

3
यह क्षेत्र की जानकारी प्राप्त करने का सबसे अच्छा, सार्वभौमिक तरीका है, यदि आप किसी दृश्य या नियंत्रक के भीतर नहीं हैं। इसे पोस्ट करने के लिए धन्यवाद!
bdrelling

19

आप इसे कंट्रोलर का उपयोग करके प्राप्त कर सकते हैं:

ControllerContext.RouteData.DataTokens["area"]

@ user202338 क्षेत्रों को MVC2 में पेश किया गया था, इसलिए मुझे इस पर संदेह होगा, लेकिन मुझे यकीन नहीं है कि अगर उन्होंने डेटाटॉकन्स संग्रह को आबाद करने के तरीके को बदल दिया है। मैं इस तरह की पोस्ट देखता हूँ: लिंक जो MVC2 में इसका उपयोग करने की बात करता है।
मैट पेनर

10

ASP.NET Core 1.0 में मान पाया जाता है

ViewContext.RouteData.Values ​​[ "क्षेत्र"];


क्या आपको यकीन है? जहाँ तक मुझे याद है कि यह तब काम कर सकता है जब हमने अपना ऐप ASP.NET Core 2.0 पर चलाया था और अभी भी ASP.NET Core 2.1 (परीक्षण क्षणों) में काम कर रहा है।
zerox981 15

आप सही हैं, केवल रेजर पेज के लिए काम नहीं कर रहे हैं (कोई ViewContext नहीं हैं - pageModel.RouteData.Values.TryGetValue("area", out object area)इसके बजाय इसका इस्तेमाल किया जाना चाहिए)
रोमन पोक्रोव्स्कीज

9

मैंने अभी इस बारे में 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... पता नहीं क्यों।
22ka पर Syska

8

मैंने 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यह हमेशा आंतरिक रूप से आरंभिक है या नहीं।


3

MVC फ्यूचर्स में एक AreaHelpers.GetAreaName () विधि है। हालाँकि, यदि आप इस विधि का उपयोग कर रहे हैं तो सावधानी बरतें। अपने आवेदन के बारे में रनटाइम निर्णय लेने के लिए वर्तमान क्षेत्र का उपयोग करना मुश्किल-से-डिबग या असुरक्षित कोड हो सकता है।


1
नियंत्रकों के लिए क्या ऐसी कोई विधि है? मैं एक संग्रह में स्ट्रिंग शाब्दिक का उपयोग करने से नफरत करता हूं।
एरिक टी

नियंत्रक उपयोग के this.GetName()लिए और वर्तमान विधि के उपयोग के लिएMethodBase.GetCurrentMethod().Name
Nerdroid

3

मुझे पता है कि यह पुराना है, लेकिन यह भी, जब एक्शनफ़िल्टर जैसे फ़िल्टर में, संदर्भ आपको आसानी से क्षेत्र की जानकारी प्रदान नहीं करता है।

यह निम्नलिखित कोड में पाया जा सकता है:

var routeData = filterContext.RequestContext.RouteData;

if (routeData.DataTokens["area"] != null)
    area = routeData.DataTokens["area"].ToString();

इसलिए FilterContext को ओवरराइड पर पास किया जा रहा है और RequestContext के तहत सही रूटडेटा पाया जाता है। बेस स्तर पर एक रूटडैटा है, लेकिन डेटाकोन्स डीओ में इसका क्षेत्र नहीं है।


2

दृश्य में क्षेत्र का नाम पाने के लिए, ASP.NET कोर MVC 2.1 में:

@Context.GetRouteData().Values["area"]

2

दृश्य (.NET Core 2.2) में क्षेत्र का नाम प्राप्त करें:

ViewContext?.ActionDescriptor?.RouteValues["area"]

0

मुझे पता है कि यह एक बहुत पुरानी पोस्ट है, लेकिन हम वैल्यूज़ प्रॉपर्टी का ठीक उसी तरह से उपयोग कर सकते हैं, जैसे कि डेटाटैक्स

Url.RequestContext.RouteData.Values ​​["कार्रवाई"] ने मेरे लिए काम किया।


0

मुझे नहीं पता कि क्यों, लेकिन स्वीकृत उत्तर काम नहीं कर रहा है। यह उदाहरण के साथ अशक्त देता है (शायद mvc के बारे में, मैं .net कोर का उपयोग करता हूं)

http: // localhost: 5000 / व्यवस्थापक / CustomerGroup

मैं हमेशा चर को डीबग करता हूं और उसमें से डेटा प्राप्त करता हूं।

इसे इस्तेमाल करे। इससे मेरा काम बनता है

var area = ViewContext.RouteData.Values["area"]

विस्तृत तार्किक उदाहरण

Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.