ভিউ বা নিয়ামকটিতে আপনি বর্তমান অঞ্চলের নাম কীভাবে পাবেন?
ViewContext.RouteData.Values["controller"]
এলাকার মতো কিছু আছে কি ?
ভিউ বা নিয়ামকটিতে আপনি বর্তমান অঞ্চলের নাম কীভাবে পাবেন?
ViewContext.RouteData.Values["controller"]
এলাকার মতো কিছু আছে কি ?
উত্তর:
এমভিসি 2 থেকে আপনি ব্যবহার করতে পারেন ViewContext.RouteData.DataTokens["area"]
ASP.NET Core 1.0
পরিবর্তে বলা হয় MVC6
.. :-)
আপনি এটি ব্যবহার করে নিয়ামকের কাছ থেকে এটি পেতে পারেন:
ControllerContext.RouteData.DataTokens["area"]
এএসপি.নেট কোর 1.0 তে মানটি পাওয়া যায়
ViewContext.RouteData.Values [ "এলাকা"];
pageModel.RouteData.Values.TryGetValue("area", out object area)
পরিবর্তে ব্যবহার করা উচিত)
আমি এই সম্পর্কে আব লগ এন্ট্রি লিখেছি , আপনি আরও তথ্যের জন্য এটি দেখতে পারেন, তবে আমার উত্তরটি ছিল নীচে দেখানো একটি এক্সটেনশন পদ্ধতি তৈরি করা।
মূল কিকারটি হ'ল আপনি এমভিসি এরিয়াটি .ডাটাটোকেনস থেকে এবং নিয়ন্ত্রক / ক্রিয়াটি থেকে টানুন। রুটডাটার মূল্যগুলি 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
... কেন কারণ তা নয়।
আমি এটির জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি 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
এটি সর্বদা অভ্যন্তরীণভাবে সূচনা হওয়ার কারণে নাল কিনা তা খতিয়ে দেখার দরকার নেই ।
এমভিসি ফিউচারগুলির একটি এরিয়া হেল্পার্স GGetAreaName () পদ্ধতি রয়েছে। তবে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে সাবধানতা অবলম্বন করুন। আপনার অ্যাপ্লিকেশন সম্পর্কে রানটাইম সিদ্ধান্ত নিতে বর্তমান অঞ্চলটি ব্যবহার করা কঠিন-ডিবাগ বা সুরক্ষিত কোডের দিকে নিয়ে যেতে পারে।
this.GetName()
জন্য এবং বর্তমান পদ্ধতি ব্যবহারের জন্যMethodBase.GetCurrentMethod().Name
আমি জানি এটি পুরানো, তবে এছাড়াও, যখন অ্যাকশনফিল্টারের মতো ফিল্টারে থাকে, প্রসঙ্গটি আপনাকে সহজেই অঞ্চল সম্পর্কিত তথ্য সরবরাহ করে না।
এটি নিম্নলিখিত কোডে পাওয়া যাবে:
var routeData = filterContext.RequestContext.RouteData;
if (routeData.DataTokens["area"] != null)
area = routeData.DataTokens["area"].ToString();
সুতরাং ফিল্টারকন্টেক্সট ওভাররাইডে পাশ করা হচ্ছে এবং অনুরোধকন্টেক্সট-এর অধীনে সঠিক রুটডেটা খুঁজে পাওয়া গেছে। বেস স্তরে একটি রাউডটাটা রয়েছে, তবে ডেটাটোকেনগুলির অভিধানের ক্ষেত্রটি নেই।
আমি জানি এটি একটি খুব পুরানো পোস্ট তবে আমরা মান সংস্থানটি ডেটা টোকেন্স হিসাবে ঠিক একইভাবে ব্যবহার করতে পারি
Url.RequestContext. RouteData.Values ["ক্রিয়া"] আমার পক্ষে কাজ করেছে।
আমি জানি না কেন তবে গৃহীত উত্তরগুলি কাজ করছে না। উদাহরণস্বরূপ এটি নাল ফেরায় (সম্ভবত এমভিসি সম্পর্কে, আমি নেট নেট ব্যবহার করি)
আমি সর্বদা ভেরিয়েবলটি ডিবাগ করি এবং এর থেকে ডেটা আনি।
এটা চেষ্টা কর. এটা আমার জন্য কাজ করে
var area = ViewContext.RouteData.Values["area"]
বিস্তারিত যৌক্তিক উদাহরণ
Layout = ViewContext.RouteData.Values["area"] == null ? "_LayoutUser" : "_LayoutAdmin";