ভিউ বা কন্ট্রোলারে বর্তমান অঞ্চলের নাম পান


126

ভিউ বা নিয়ামকটিতে আপনি বর্তমান অঞ্চলের নাম কীভাবে পাবেন?

ViewContext.RouteData.Values["controller"]এলাকার মতো কিছু আছে কি ?

উত্তর:


217

এমভিসি 2 থেকে আপনি ব্যবহার করতে পারেন ViewContext.RouteData.DataTokens["area"]


22
কোনও অঞ্চলে না থাকলে, ভিউকনটেক্সট.রউটেডটা.ডাটাটোকেন্স ["অঞ্চল"] == নাল।
ব্যবহারকারী 202448

23
... এবং এমভিসি 5 তে :)
স্টেফান

4
লল .. কৌতুকটি আপনার উপরে রয়েছে @ দন্ত ... ভাল হতে ভাল এটি এর ASP.NET Core 1.0পরিবর্তে বলা হয় MVC6.. :-)
রোসদি কাসিম

এফওয়াইআই - আমার অজ্যাক্স পোস্টে কী হয়েছে তা ভুল করে বুঝতে পেরেছিল যে কাজ করছে না ... দয়া করে আপনার এজ্যাক্স অনুরোধগুলির URL এর ক্ষেত্র রয়েছে কিনা তা দেখুন ... তারা এখনও খুঁজে পেতে পারে !!! দেখুন, তবে তারা অঞ্চলটি রক্ষণ করবে না ... যদি অনুরোধ করা হয় তখন url এ অঞ্চলটি অনুপস্থিত।
Seabizkit

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

3
আপনি যদি কোনও দর্শন বা নিয়ামকের মধ্যে না থাকেন তবে এই অঞ্চল সম্পর্কিত তথ্যটি পাওয়ার সেরা, সর্বজনীন উপায়। এই পোস্ট করার জন্য ধন্যবাদ!
বিড্রেলিং

19

আপনি এটি ব্যবহার করে নিয়ামকের কাছ থেকে এটি পেতে পারেন:

ControllerContext.RouteData.DataTokens["area"]

@ ব্যবহারকারী202338 অঞ্চলগুলি এমভিসি 2 তে চালু হয়েছিল যাতে আমার সন্দেহ হয় তবে আমি নিশ্চিত নই যে তারা ডেটা টোকেন্স সংগ্রহের পপুলেশন করার পদ্ধতি পরিবর্তন করেছে কিনা। আমি এই জাতীয় পোস্ট দেখতে পাচ্ছি: এমভিসি 2 এ এটি ব্যবহারের বিষয়ে কথা বলার লিঙ্ক
ম্যাট পেনার

10

এএসপি.নেট কোর 1.0 তে মানটি পাওয়া যায়

ViewContext.RouteData.Values ​​[ "এলাকা"];


তুমি কি নিশ্চিত? আমি যতদূর মনে করতে পারি এটি কাজ করেছিল যখন আমরা এএসপি.নেট কোর 2.0 তে আমাদের অ্যাপটি চালিত করেছিলাম এবং এখনও এএসপি.নেট কোর 2.1 তে কাজ করছি (মুহুর্তের আগে পরীক্ষিত)।
zerox981

আপনি ঠিক বলেছেন, কেবল রেজার পাতাগুলির জন্য কাজ করছেন না (কোনও ভিউকন্টেক্সট নেই - pageModel.RouteData.Values.TryGetValue("area", out object area)পরিবর্তে ব্যবহার করা উচিত)
রোমান পোকারভস্কিচ

9

আমি এই সম্পর্কে আব লগ এন্ট্রি লিখেছি , আপনি আরও তথ্যের জন্য এটি দেখতে পারেন, তবে আমার উত্তরটি ছিল নীচে দেখানো একটি এক্সটেনশন পদ্ধতি তৈরি করা।

মূল কিকারটি হ'ল আপনি এমভিসি এরিয়াটি .ডাটাটোকেনস থেকে এবং নিয়ন্ত্রক / ক্রিয়াটি থেকে টানুন। রুটডাটার মূল্যগুলি al

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... কেন কারণ তা নয়।
সিসকা

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

এমভিসি ফিউচারগুলির একটি এরিয়া হেল্পার্স GGetAreaName () পদ্ধতি রয়েছে। তবে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে সাবধানতা অবলম্বন করুন। আপনার অ্যাপ্লিকেশন সম্পর্কে রানটাইম সিদ্ধান্ত নিতে বর্তমান অঞ্চলটি ব্যবহার করা কঠিন-ডিবাগ বা সুরক্ষিত কোডের দিকে নিয়ে যেতে পারে।


1
নিয়ামকদের জন্য কি এর মতো কোনও পদ্ধতি আছে? আমি একটি সংগ্রহে স্ট্রিং আক্ষরিক ব্যবহার ঘৃণা করি।
এরিক টি

নিয়ামক ব্যবহারের this.GetName()জন্য এবং বর্তমান পদ্ধতি ব্যবহারের জন্যMethodBase.GetCurrentMethod().Name
নেরড্রয়েড

3

আমি জানি এটি পুরানো, তবে এছাড়াও, যখন অ্যাকশনফিল্টারের মতো ফিল্টারে থাকে, প্রসঙ্গটি আপনাকে সহজেই অঞ্চল সম্পর্কিত তথ্য সরবরাহ করে না।

এটি নিম্নলিখিত কোডে পাওয়া যাবে:

var routeData = filterContext.RequestContext.RouteData;

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

সুতরাং ফিল্টারকন্টেক্সট ওভাররাইডে পাশ করা হচ্ছে এবং অনুরোধকন্টেক্সট-এর অধীনে সঠিক রুটডেটা খুঁজে পাওয়া গেছে। বেস স্তরে একটি রাউডটাটা রয়েছে, তবে ডেটাটোকেনগুলির অভিধানের ক্ষেত্রটি নেই।


2

ভিউ এরিয়া নাম পেতে, এএসপি.নেট কোর এমভিসি ২.১ এ:

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

2

ভিউতে (। নেট কোর 2.2) এ এলাকার নাম পান:

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

0

আমি জানি এটি একটি খুব পুরানো পোস্ট তবে আমরা মান সংস্থানটি ডেটা টোকেন্স হিসাবে ঠিক একইভাবে ব্যবহার করতে পারি

Url.RequestContext. RouteData.Values ​​["ক্রিয়া"] আমার পক্ষে কাজ করেছে।


0

আমি জানি না কেন তবে গৃহীত উত্তরগুলি কাজ করছে না। উদাহরণস্বরূপ এটি নাল ফেরায় (সম্ভবত এমভিসি সম্পর্কে, আমি নেট নেট ব্যবহার করি)

HTTP: // স্থানীয় হোস্ট: 5000 / প্রশাসক / CustomerGroup

আমি সর্বদা ভেরিয়েবলটি ডিবাগ করি এবং এর থেকে ডেটা আনি।

এটা চেষ্টা কর. এটা আমার জন্য কাজ করে

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

বিস্তারিত যৌক্তিক উদাহরণ

Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.