নিয়ামকের মধ্যে থেকে নিয়ামক এবং ক্রিয়া নাম পান?


173

আমাদের ওয়েব অ্যাপ্লিকেশনটির জন্য আমাকে ভিউয়ের উপর নির্ভর করে আনীত এবং প্রদর্শিত আইটেমগুলির ক্রম সংরক্ষণ করতে হবে - বা সুনির্দিষ্ট হতে হবে - নিয়ামক এবং ক্রিয়া যা ভিউ তৈরি করে (এবং অবশ্যই ব্যবহারকারী আইডি, তবে এটি এখানে বিন্দু নয়)।

প্রতিটি নিয়ামক ক্রিয়ায় নিজেকে সনাক্তকারী দেওয়ার পরিবর্তে (এটি ডিবি আউটপুটগুলির কিছু দেখার উপর নির্ভরশীল বাছাইয়ের জন্য ব্যবহার করার জন্য), আমি ভেবেছিলাম যে নিয়ামক এবং অ্যাকশন পদ্ধতিটি এটি পায় তা থেকে স্বয়ংক্রিয়ভাবে এই সনাক্তকারী তৈরি করা নিরাপদ এবং সহজ হবে easier থেকে আহবান

আমি কীভাবে একটি নিয়ামকের মধ্যে ক্রিয়া পদ্ধতির মধ্যে থেকে নিয়ামকের নাম এবং ক্রিয়াটির নাম পেতে পারি? নাকি এর জন্য আমার প্রতিবিম্ব দরকার? আমার ধারণা এটি খুব সহজ, আগাম ধন্যবাদ!


1
প্রতিচ্ছবি আপনাকে সেই পদ্ধতির নাম দেয় যা ক্রিয়া পরিচালনা করে তবে সম্ভবত আন্দ্রেয়ের কোড অনুসারে আপনি অ্যাকশন নামটি পছন্দ করেন।
সিটিকিড

আমার মূলত প্রতিটি ক্রিয়াকলাপের জন্য একটি দ্ব্যর্থহীন শনাক্তকারী প্রয়োজন যা একটি দৃষ্টিভঙ্গি সরবরাহ করে, তাই উভয় উপায়েই কাজটি করা উচিত। তবে আপনি ঠিক বলেছেন, আন্দ্রেয়ের উত্তর অবশ্যই আরও মার্জিত।
অ্যালেক্স

@ সিটিকিড এমন কোনও মামলা রয়েছে যেখানে শ্রেণিবদ্ধ নামের ক্ষেত্রে কেস এবং "কন্ট্রোলার" প্রত্যয় বাদে এই পদ্ধতিগুলি আলাদা হয়?
জন

@John, ActionNameAttribute এসি # পদ্ধতি কোনো পদক্ষেপ নাম আছে অনুমতি দেয়: msdn.microsoft.com/en-us/library/...
citykid

@ সিটিকিড ওহ, ঠিক আছে এই ধরণের একটি অপ্রচলিত বৈশিষ্ট্য দেওয়া হয়েছে যে আপনি যে Routeক্রিয়াকলাপটি সংগ্রহ করি তার কোনও বৈশিষ্ট্য সহ আপনি রুটগুলি নির্দিষ্ট করতে পারবেন ? এছাড়াও, নিয়ামকদের নতুন নামকরণও কি সম্ভব?
জন

উত্তর:


345
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();

13
কিছু ক্ষেত্রে যেখানে আপনার ভিউ ফাইলটিতে কন্ট্রোলারের নাম থাকতে পারে, আপনি কেবল এটি ব্যবহার করতে পারেন iewউভকনটেক্সট.রউটিডেটা.ভ্যালুগুলি ["নিয়ামক"]। টুস্ট্রিং ();
Amogh নাটু

আপনি যদি এটি করতে যাচ্ছেন (ক্রিয়া এবং নিয়ামকের নাম সরবরাহ করুন), তবে কেন কেবল তাদের সরাসরি বরাদ্দ করবেন না ???
ধাতবফিনিক্স

1
@ মেটালফোনিক্স, আপনি কী ব্যবহারের ক্ষেত্রে কথা বলছেন তা কি কিছুটা পরিষ্কার করে বলতে পারেন? ওপিকে নিয়ামক বা ক্রিয়া বরাদ্দ করার প্রয়োজন নেই - এগুলি কেবল সাধারণ পদ্ধতিতে বোঝা দরকার যে বর্তমানে নিয়ামক এবং ক্রিয়াটি কীভাবে প্রক্রিয়াজাত হচ্ছে।
Andrei

1
দ্বিতীয় পাঠে, এটি কি এখানে কোড স্নিপিটকে আমি ভুল বুঝেছি? ... মানগুলি "" ক্রিয়া "] যেখানে" ক্রিয়া "একটি কী এবং পরিবর্তনের জন্য ক্রিয়াটির নাম নয় (যেমন" 'Pass123' এর উদ্ধৃতি "" ধরণের জিনিস হিসাবে নেই)? এর অর্থ হল: "[আপনার ক্রিয়া"] এর পরিবর্তে মানগুলি কি "[ক্রিয়া"] হবে?
ধাতবফিনিক্স

@ মেটালফোনিক্স, ঠিক, "অ্যাকশন" আক্ষরিক একটি কী এবং মানগুলি ["ক্রিয়া"] "কারেন্ট অ্যাকশননাম"
আন্ড্রেই

62

তথ্যটি পাওয়ার জন্য এখানে কিছু এক্সটেনশন পদ্ধতি রয়েছে (এটিতে আইডিও রয়েছে):

public static class HtmlRequestHelper
{
    public static string Id(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("id"))
            return (string)routeValues["id"];
        else if (HttpContext.Current.Request.QueryString.AllKeys.Contains("id"))
            return HttpContext.Current.Request.QueryString["id"];

        return string.Empty;
    }

    public static string Controller(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("controller"))
            return (string)routeValues["controller"];

        return string.Empty;
    }

    public static string Action(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("action"))
            return (string)routeValues["action"];

        return string.Empty;
    }
}

ব্যবহার:

@Html.Controller();
@Html.Action();
@Html.Id();

1
সেরা ও সম্পূর্ণ সমাধান, ধন্যবাদ ঝন
উমর আব্বাস

24

দরকারী হতে পারে। কন্ট্রোলারের কনস্ট্রাক্টরে আমার ক্রিয়া দরকার ছিল এবং এটি এমভিসি লাইফসাইকের এই পর্যায়ে উপস্থিত হয়, thisআরম্ভ হয় নি এবং ControllerContext = null। এমভিসি লাইফসাইকেলে অনুসন্ধান করা এবং ওভাররাইডের জন্য উপযুক্ত ফাংশনটির নামটি সন্ধান করার পরিবর্তে, আমি সবেমাত্র এ্যাকশনটি পেয়েছি RequestContext.RouteData

তবে এটির HttpContextজন্য, কনস্ট্রাক্টরের কোনও সম্পর্কিত ব্যবহারের মতো আপনাকেও পুরো নামস্থানটি নির্দিষ্ট করতে হবে, কারণ this.HttpContextএটিও আরম্ভ করা হয়নি। ভাগ্যক্রমে, এটি System.Web.HttpContext.Currentস্থির হয়।

// controller constructor
public MyController() {
    // grab action from RequestContext
    string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action");

    // grab session (another example of using System.Web.HttpContext static reference)
    string sessionTest = System.Web.HttpContext.Current.Session["test"] as string
}

দ্রষ্টব্য: সম্ভবত HTTPContext- এ সমস্ত সম্পত্তি অ্যাক্সেসের সবচেয়ে সমর্থিত উপায় নয়, তবে অনুরোধকন্টেক্সট এবং সেশনের জন্য এটি আমার অ্যাপ্লিকেশনটিতে ভাল কাজ করেছে বলে মনে হয়।


11
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues != null) 
{
    if (routeValues.ContainsKey("action"))
    {
        var actionName = routeValues["action"].ToString();
                }
    if (routeValues.ContainsKey("controller"))
    {
        var controllerName = routeValues["controller"].ToString();
    }
}


4

আমার এ পর্যন্ত যা আছে:

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

3

নাম পাওয়ার জন্য এখানে সবচেয়ে সহজ এবং ব্যবহারিক উত্তর:

var actionName = RouteData.Values["action"];
var controllerName = RouteData.Values["controller"];

অথবা

string actionName = RouteData.Values["action"].ToString();
string controllerName = RouteData.Values["controller"].ToString();

উপরের কোডগুলি এসপ নেটওয়্যার এমভিসি 5 দিয়ে পরীক্ষা করুন।


2

এটি getDefaults () পদ্ধতির অভ্যন্তরে আপনার বেস নিয়ামকটিতে যুক্ত করুন

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         GetDefaults();
         base.OnActionExecuting(filterContext);
    }

    private void GetDefaults()
    {
    var actionName = filterContext.ActionDescriptor.ActionName;
    var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    }

বেসকন্ট্রোলারে আপনার নিয়ন্ত্রকদের প্রয়োগ করুন

একটি আংশিক দৃশ্য _Breadcrumb.cshtml যুক্ত করুন এবং এটি @ এইচটিএমএল. পার্টিশিয়াল ("_ Breadcrumb") এর সাথে সমস্ত প্রয়োজনীয় পৃষ্ঠায় যুক্ত করুন

_Breadcrumb.cshtml

<span>
    <a href="../@ViewData["controllerName"]">
        @ViewData["controllerName"]
    </a> > @ViewData["actionName"]
</span>

(1): এটি এখনও এমভিসি 5 এর মধ্যে অন্যতম সাধারণ উপায়? (২) আপনি নিজের filterContextভেরিয়েবলটি কোথা থেকে পাবেন GetDefaults()?
chriszo111

1

আপনি কোনও ভেরিয়েবলের মতো ক্রিয়া থেকে নিয়ামকের নাম বা ক্রিয়া নাম পেতে পারেন। এগুলি কেবল বিশেষ (নিয়ন্ত্রক এবং ক্রিয়া) এবং ইতিমধ্যে সংজ্ঞায়িত হয়েছে যাতে আপনার প্রয়োজনের কথা বলা বাদ দিয়ে এগুলি পাওয়ার জন্য আপনার বিশেষ কিছু করার দরকার নেই।

public string Index(string controller,string action)
   {
     var names=string.Format("Controller : {0}, Action: {1}",controller,action);
     return names;
   }

অথবা আপনি দুটি এবং আপনার কাস্টম ডেটা পেতে আপনার মডেলগুলিতে কন্ট্রোলার, ক্রিয়া অন্তর্ভুক্ত করতে পারেন।

public class DtoModel
    {
        public string Action { get; set; }
        public string Controller { get; set; }
        public string Name { get; set; }
    }

public string Index(DtoModel baseModel)
    {
        var names=string.Format("Controller : {0}, Action: {1}",baseModel.Controller,baseModel.Action);
        return names;
    }

1

এটি আমার (এখনও অবধি) খুব সুন্দরভাবে কাজ করেছে বলে মনে হয়, আপনি যদি অ্যাট্রিবিউট রাউটিং ব্যবহার করছেন তবে এটিও কাজ করে।

public class BaseController : Controller
{
    protected string CurrentAction { get; private set; }
    protected string CurrentController { get; private set; }

    protected override void Initialize(RequestContext requestContext)
    {
        this.PopulateControllerActionInfo(requestContext);
    }

    private void PopulateControllerActionInfo(RequestContext requestContext)
    {
        RouteData routedata = requestContext.RouteData;

        object routes;

        if (routedata.Values.TryGetValue("MS_DirectRouteMatches", out routes))
        {
            routedata = (routes as List<RouteData>)?.FirstOrDefault();
        }

        if (routedata == null)
            return;

        Func<string, string> getValue = (s) =>
        {
            object o;
            return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty;
        };

        this.CurrentAction = getValue("action");
        this.CurrentController = getValue("controller");
    }
}

1

ToString()কল ব্যবহারের প্রয়োজন অপসারণ করতে

string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");

1

অ্যাকশন এবং কন্ট্রোলার নামের জন্য অনঅ্যাকশনএক্সেকিউটে দেওয়া লাইনগুলি ব্যবহার করুন।

স্ট্রিং অ্যাকশননেম = এটি ont কন্ট্রোলার কনটেক্সট ou রউটিডাটা.ভ্যালুস ["ক্রিয়া"] To টুস্ট্রিং ();

স্ট্রিং কন্ট্রোলারনাম = এটি ont কন্ট্রোলার কনটেক্সট ou রুটডাটা.ভ্যালুস ["কন্ট্রোলার"] To টুস্ট্রিং ();


-8

সরল কিছু হচ্ছে না কেন?

কেবল কল করুন Request.Path, এটি "/" দ্বারা পৃথক করা একটি স্ট্রিং ফিরিয়ে দেবে

এবং তারপরে আপনি .Split('/')[1]কন্ট্রোলারের নাম পেতে ব্যবহার করতে পারেন ।

এখানে চিত্র বর্ণনা লিখুন


1
-1: আপনার কোড সহ, উপ-স্তরের অ্যাপ্লিকেশনগুলি কেবল উপেক্ষা করা হবে (যেমন http://www.example.com/sites/site1/controllerA/actionB/:)। এমভিসি রাউটিংয়ের জন্য একগুচ্ছ এপিআই এর সরবরাহ করে, তবে আপনাকে ইউআরএলগুলি (আবার) পার্স করার দরকার কেন ?.
টি-মোটি

চাকা পুনরায় উদ্ভাবন এবং তদ্বিপরীত, একটি খারাপ পুনর্বহাল কেন? এটি সব ক্ষেত্রে কার্যকর হয় না।
jstuardo

সাবফোল্ডারদের পক্ষে, আসল সমস্যাটি হ'ল আপনি নিজের রুটগুলি কাস্টমাইজ করতে পারেন যাতে সেগুলি সর্বদা হয় নাcontroller/action
ড্রাজাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.