আমি কীভাবে এএসপি.নেট এমভিসি ভিউতে বর্তমান ক্রিয়াটি ফিরিয়ে দিতে পারি?


291

আমি আমার মাস্টার পৃষ্ঠায় একটি সিএসএস ক্লাস সেট করতে চেয়েছিলাম, যা বর্তমান নিয়ামক এবং ক্রিয়া উপর নির্ভর করে। আমি বর্তমান কন্ট্রোলারের মাধ্যমে ViewContext.Controller.GetType().Nameযেতে পারি, তবে কীভাবে আমি বর্তমান ক্রিয়াটি পেতে পারি (যেমন Index, Showইত্যাদি)?

উত্তর:


83

ব্যবহার করুন ViewContextএবং বর্ণন RouteDataসংগ্রহে উভয় নিয়ামক এবং কর্ম উপাদান বের করে আনতে। তবে আমি মনে করি যে কিছু ডেটা ভেরিয়েবল সেট করা যা অ্যাপ্লিকেশন প্রসঙ্গটি নির্দেশ করে (যেমন, "এডিটমোড" বা "ত্রুটি") নিয়ামক / ক্রিয়া আপনার দৃষ্টিভঙ্গি এবং নিয়ামকদের মধ্যে সংযোগকে হ্রাস করে।


আপনি কন্ট্রোলারে ডেটা পেতে এবং ডিটিওর সাথে দেখতে এটি পাস করতে পারেন। stackoverflow.com/a/31749391/4293929
MstfAsan

5
এটি অবশ্যই গ্রহণযোগ্য উত্তর নয়, পরিবর্তে সর্বাধিক আপ করা উত্তর দেখুন।
হাকান ফাস্টিক

1
@ হ্যাকামফস্টক আমি এখনও মনে করি যে মডেলটিতে অর্থপূর্ণ তথ্য যুক্ত করার পরামর্শটি আপনার ক্ষেত্রে রুট ডেটা (নিয়ামক, ক্রিয়া) এর উপর নির্ভর করার চেয়ে সমস্ত ক্ষেত্রে একটি ভাল পদ্ধতি, এমনকি যদি অন্য উত্তর কীভাবে সেই ডেটা পেতে পারে সে সম্পর্কে আরও বিশদ সরবরাহ করে।
tvanfosson

467

আরসিতে আপনি এর মতো ক্রিয়া পদ্ধতির নামের মতো রুট ডেটাও বের করতে পারেন

ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue

এমভিসি 3 এর জন্য আপডেট

ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue

এমভিসি 4 এর জন্য আপডেট

ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]

এমভিসি 4.5 এর জন্য আপডেট

ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]

20
আমি এই প্রাক-তারিখগুলি ভি 2 জানি, তবে এটি এখন ViewContext.Controller.ValueProvider.GetValue("action").RawValue+ প্রকরণের
ক্রিস এস

7
এই বাক্য গঠনটি ভি 4: (স্ট্রিং) ভিউ কনটেক্সট.রউটেডটা.ভ্যালুগুলিতে ["ক্রিয়া"] তে কাজ করে;
কিপ্রেনে

2
এই সমাধানটি আমার পক্ষে কাজ করে না (এমভিসি 4 +। নেট ফ্রেমওয়ার্ক 4.5.5)। আমার জন্য, এটি ভাইচেসলভ স্মৃতিখ: ভিউকনটেক্সট.রউটিডাটা.ভ্যালুগুলি ["অ্যাকশন"], ভিউ কনটেক্সট.রউটেডাটা.ভ্যালুস ["নিয়ামক"], ভিউ কনটেক্সট।রউটেডাটা.ভ্যালুগুলি ["আইডি"],
টমাস কুবেস

@kiprainey সালে V3.5 খুব: msdn.microsoft.com/en-us/library/...
প্লুটোর

2
চেষ্টা করুন: (স্ট্রিং) HTTPContext.Request.RequestContext.RouteData.Values ​​["ক্রিয়া"];
মার্টিন ডসন

60

একটি ভিউতে বর্তমান আইডি পেতে:

ViewContext.RouteData.Values["id"].ToString()

বর্তমান নিয়ামক পেতে:

ViewContext.RouteData.Values["controller"].ToString() 

1
ভিউ কনটেক্সট.রউটিডেটা.ভ্যালুগুলি [<key>]। টুস্ট্রিং () যদি রুটটাটাতে মানটি না উপস্থিত থাকে তবে একটি ব্যতিক্রম ছুঁড়ে
গ্রিজলি পিক সফ্টওয়্যার

@ শ্যানলারসন কেবল শূন্যের সাথে তুলনা করুন বা ViewContext.RouteData.Values.ContainsKey(<key>)প্রথমে চেক করুন ।
প্লুটো

40

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি এটি দেখেছি এবং আমি ভেবেছিলাম যে এটির কাজটি করার জন্য আপনার ভিউ হ্যান্ডেলটি ডেটা পুনরুদ্ধার করার চেয়ে বিকল্প বিকল্পে আগ্রহী।

আমার মতে একটি সহজ উপায় হ'ল অন্যাকশনএক্সেকুটিং পদ্ধতিটি ওভাররাইড করা । আপনি অ্যাকশনএক্সেকিউটিংকনটেক্সট পাস করেছেন যাতে আপনি যে সন্ধানের জন্য অনুসন্ধান করছেন তা প্রাপ্ত করার জন্য আপনি ব্যবহার করতে পারেন এমন অ্যাকশনডিস্ক্রিপ্টর সদস্য রয়েছে যা অ্যাকশননাম এবং আপনি কন্ট্রোলার ডেস্ক্রিপ্টারেও পৌঁছে যেতে পারেন এবং এতে কন্ট্রোলারনাম রয়েছে।

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.
}

আশাকরি এটা সাহায্য করবে. যদি কিছু হয় তবে কমপক্ষে এটি আপনার প্রশ্নের দ্বারা আসা অন্য যে কোনও ব্যক্তির জন্য একটি বিকল্প প্রদর্শন করবে।


চমৎকার সুপারিশ; বুদ্ধিমানভাবে নিয়ন্ত্রণকারী / অ্যাকশন সেন্সিং বাস্তবায়নে আমাকে সহায়তা করেছে। ধন্যবাদ!
ਪ੍ਰਭਾਵিত

অ্যাকশন desrciptor পাওয়া আমার যা প্রয়োজন তা হ'ল, আমি সত্যিই অন্য কোনও সমাধান খুঁজে পেলাম না তাই আমি কেবল এটি এখানে করি এবং তারপরে আমি যা চাই তা ভিউব্যাগের মধ্যে ফেলে দিতে পারি।
ক্রিস মেরিসিক

17

আমি বিভিন্ন উত্তর দেখেছি এবং একটি ক্লাস সহায়ক নিয়ে এসেছি:

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>

আশা করি এটা সাহায্য করবে.



9

এমভিসিতে আপনার সমস্ত ডেটা দিয়ে ভিউ সরবরাহ করা উচিত, ভিউর নিজস্ব ডেটা সংগ্রহ না করা যাতে আপনি যা করতে পারেন তা আপনার নিয়ামক ক্রিয়ায় সিএসএস শ্রেণি সেট করা।

ViewData["CssClass"] = "bold";

এবং আপনার ভিউতে আপনার ভিউডাটা থেকে এই মানটিটি বেছে নিন


নিয়ামক কাঠামোর উপর নির্ভর করে দৃষ্টিভঙ্গি রাখার জন্য এটি আমার পছন্দসই পদ্ধতি হবে তবে এটি অন্যথায় করা যেতে পারে।
tvanfosson

1
নিশ্চিত নয় যে আমি এটির নাম "সিএসএসক্লাস" রাখব কারণ এটি মনে করে যে প্রদর্শিত লজিক আপনার নিয়ামকের মধ্যে ক্রপ হচ্ছে।
tvanfosson

সম্মত, আমি সাধারণত "প্রসঙ্গ" এর মতো কিছু করি, সুতরাং এটি উপস্থাপনা স্তরের সাথে আবদ্ধ নয় এবং আপনি যদি ভিউটির নাম পরিবর্তন করেন তবে তা ভাঙবে না।
রেডফিল্টার

6

আমি এই 2 জন্য ভোট:

string currentActionName = ViewContext.RouteData.GetRequiredString("action");

এবং

string currentViewName = ((WebFormView)ViewContext.View).ViewPath;

আপনি বর্তমান ভিউ এবং ক্রিয়াকলাপের শারীরিক নাম উভয়ই এটি পুনরুদ্ধার করতে পারেন যা এটিকে ট্রিগার করেছিল। হোস্ট ধারক নির্ধারণের জন্য এটি আংশিক * .acmx পৃষ্ঠাগুলিতে দরকারী হতে পারে।


2

আমি এএসপি.নেট এমভিসি 4 ব্যবহার করছি এবং এটি আমার জন্য কাজ করেছে:

ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue

0

ডেল রাগানের উত্তর প্রসারিত করে , পুনরায় ব্যবহারের জন্য তার উদাহরণ, একটি অ্যাপ্লিকেশন নিয়ন্ত্রণকারী শ্রেণি তৈরি করুন যা নিয়ামক থেকে উদ্ভূত হয় এবং ফলস্বরূপ আপনার অন্যান্য সমস্ত নিয়ামকগুলি সেই অ্যাপ্লিকেশন নিয়ন্ত্রণকারী শ্রেণীর পরিবর্তে কন্ট্রোলার থেকে প্রাপ্ত হয়।

উদাহরণ:

public class MyCustomApplicationController : Controller {}

public class HomeController : MyCustomApplicationController {}

আপনার নতুন অ্যাপ্লিকেশন নিয়ন্ত্রণকারীকে এই স্বাক্ষর দিয়ে এক্সিকিউটিংএকশন নামে একটি সম্পত্তি তৈরি করুন:

protected ActionDescriptor ExecutingAction { get; set; }

এবং তারপরে অনএ্যাকশনএক্সেকিউটিং পদ্ধতিতে (ডেল রাগানের উত্তর থেকে) সহজেই এই সম্পত্তিটিতে অ্যাকশনডেস্কিটর নির্ধারণ করুন এবং যখনই আপনার কোনও নিয়ামকের প্রয়োজন হবে আপনি এটিকে অ্যাক্সেস করতে পারবেন।

string currentActionName = this.ExecutingAction.ActionName;

0

আপনার নিয়ামকটিতে এই ফাংশনটি ওভাররাইড করুন

protected override void HandleUnknownAction(string actionName) 
{  TempData["actionName"] = actionName;
   View("urViewName").ExecuteResult(this.ControllerContext);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.