উত্তর:
ব্যবহার করুন 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>)
প্রথমে চেক করুন ।
আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি এটি দেখেছি এবং আমি ভেবেছিলাম যে এটির কাজটি করার জন্য আপনার ভিউ হ্যান্ডেলটি ডেটা পুনরুদ্ধার করার চেয়ে বিকল্প বিকল্পে আগ্রহী।
আমার মতে একটি সহজ উপায় হ'ল অন্যাকশনএক্সেকুটিং পদ্ধতিটি ওভাররাইড করা । আপনি অ্যাকশনএক্সেকিউটিংকনটেক্সট পাস করেছেন যাতে আপনি যে সন্ধানের জন্য অনুসন্ধান করছেন তা প্রাপ্ত করার জন্য আপনি ব্যবহার করতে পারেন এমন অ্যাকশনডিস্ক্রিপ্টর সদস্য রয়েছে যা অ্যাকশননাম এবং আপনি কন্ট্রোলার ডেস্ক্রিপ্টারেও পৌঁছে যেতে পারেন এবং এতে কন্ট্রোলারনাম রয়েছে।
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.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
এমভিসিতে আপনার সমস্ত ডেটা দিয়ে ভিউ সরবরাহ করা উচিত, ভিউর নিজস্ব ডেটা সংগ্রহ না করা যাতে আপনি যা করতে পারেন তা আপনার নিয়ামক ক্রিয়ায় সিএসএস শ্রেণি সেট করা।
ViewData["CssClass"] = "bold";
এবং আপনার ভিউতে আপনার ভিউডাটা থেকে এই মানটিটি বেছে নিন
আমি এই 2 জন্য ভোট:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
এবং
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
আপনি বর্তমান ভিউ এবং ক্রিয়াকলাপের শারীরিক নাম উভয়ই এটি পুনরুদ্ধার করতে পারেন যা এটিকে ট্রিগার করেছিল। হোস্ট ধারক নির্ধারণের জন্য এটি আংশিক * .acmx পৃষ্ঠাগুলিতে দরকারী হতে পারে।
ডেল রাগানের উত্তর প্রসারিত করে , পুনরায় ব্যবহারের জন্য তার উদাহরণ, একটি অ্যাপ্লিকেশন নিয়ন্ত্রণকারী শ্রেণি তৈরি করুন যা নিয়ামক থেকে উদ্ভূত হয় এবং ফলস্বরূপ আপনার অন্যান্য সমস্ত নিয়ামকগুলি সেই অ্যাপ্লিকেশন নিয়ন্ত্রণকারী শ্রেণীর পরিবর্তে কন্ট্রোলার থেকে প্রাপ্ত হয়।
উদাহরণ:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
আপনার নতুন অ্যাপ্লিকেশন নিয়ন্ত্রণকারীকে এই স্বাক্ষর দিয়ে এক্সিকিউটিংএকশন নামে একটি সম্পত্তি তৈরি করুন:
protected ActionDescriptor ExecutingAction { get; set; }
এবং তারপরে অনএ্যাকশনএক্সেকিউটিং পদ্ধতিতে (ডেল রাগানের উত্তর থেকে) সহজেই এই সম্পত্তিটিতে অ্যাকশনডেস্কিটর নির্ধারণ করুন এবং যখনই আপনার কোনও নিয়ামকের প্রয়োজন হবে আপনি এটিকে অ্যাক্সেস করতে পারবেন।
string currentActionName = this.ExecutingAction.ActionName;
আপনার নিয়ামকটিতে এই ফাংশনটি ওভাররাইড করুন
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}