আপনি কি এএসপি.নেট এমভিসিতে নিয়ন্ত্রণের পদ্ধতিগুলি ওভারলোড করতে পারেন?


327

আপনি এএসপি.এনইটি এমভিসিতে নিয়ন্ত্রণকারী পদ্ধতিগুলি ওভারলোড করতে পারেন কিনা তা জানতে আগ্রহী। আমি যখনই চেষ্টা করি, আমি নীচে ত্রুটি পেয়েছি। দুটি পদ্ধতি বিভিন্ন যুক্তি গ্রহণ করে। এটি কি এমন কিছু যা করা যায় না?

কন্ট্রোলার টাইপ 'মাইমাথোড' এর ক্রিয়া করার জন্য বর্তমান অনুরোধটি 'মাইকন্ট্রোলার' নিম্নলিখিত ক্রিয়া পদ্ধতির মধ্যে অস্পষ্ট:


10
এমডিসি 4 এর জন্য @ এছাড়াও এটি একই :)
বাসরত

10
এবং
এমভিসি

10
এবং এমভিসি 6
ইমাদ

7
এবং এমভিসি কোর 1.1
kall2sollies

7
এবং এমভিসি কোর 2.0- এর জন্য একই
গিলহর্ম 19

উত্তর:


201

আপনি যদি নিজের কোডটি ওভারলোডিং করতে চান তবে আপনি বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

[ActionName("MyOverloadedName")]

তবে, আপনাকে একই http পদ্ধতিতে (যেমন অন্যরা বলেছেন) আলাদা আলাদা ক্রিয়া নাম ব্যবহার করতে হবে। সুতরাং এটি এই মুহূর্তে শব্দার্থবিজ্ঞান। আপনি বরং আপনার কোড বা আপনার গুণাবলী মধ্যে নাম রাখতে চান?

ফিল এর সাথে সম্পর্কিত একটি নিবন্ধ রয়েছে: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx


5
এটি ব্যবহার এবং আপনার ক্রিয়াটি ওভারলোড করার মূল অবক্ষয় হ'ল এটি আর একই ভিউ ফাইলের মাধ্যমে আর রেন্ডার করা যায় না।
জেফ মার্টিন

66
আসলে, এটি এখনও একই ভিউ ফাইলটি রেন্ডার করতে পারে। অন্ধভাবে কল করার পরিবর্তে আপনাকে কেবল ভিউটির নাম উল্লেখ করতে হবে return View();। উদাহরণস্বরূপ: return View("MyOverloadedName");
EAMAN

1
@JD কিন্তু মাইক্রোসফট বলছে .. একটি একটি নিয়ামক কর্ম হিসাবে ব্যবহার পদ্ধতি ওভারলোড করা যাবে না .. আপনি এটা এখানে দেখতে পারেন .. asp.net/mvc/tutorials/controllers-and-routing/...
himanshupareek66

@ এমানান নিস, আমি এখন পর্যন্ত দেখার জন্য সর্বদা পুরো পথটি সংজ্ঞায়িত করেছিলাম
আলেকজান্ডার ডার্ক

69

হ্যাঁ. আমি প্রতিটি নিয়ামক পদ্ধতির জন্য HttpGet/ HttpPost(বা সমতুল্য AcceptVerbsবৈশিষ্ট্য) সেট করে এটি করতে সক্ষম হয়েছি পৃথক কিছুতে, অর্থাত্, HttpGetবা HttpPost, তবে উভয়ই নয়। কোন পদ্ধতিটি ব্যবহার করা উচিত তা অনুরোধের ধরণের ভিত্তিতে এটি বলতে পারে।

[HttpGet]
public ActionResult Show()
{
   ...
}

[HttpPost]
public ActionResult Show( string userName )
{
   ...
}

আমার একটি পরামর্শ হ'ল, এর মতো একটি ক্ষেত্রে একটি ব্যক্তিগত বাস্তবায়ন হ'ল আপনার জনসাধারণের অ্যাকশন পদ্ধতির উভয়ই সদৃশ কোড এড়ানোর জন্য নির্ভর করে।


1
এমভিসি 2 সহ এবং আরও কেউ এইচটিপিপোস্ট / এইচটিটিপি গেট বৈশিষ্ট্যটি ব্যবহার করতে পারে
ইওয়েল হালব

@ ওহাল হ্যাঁ, এখন যদি এটি একাধিক ক্রিয়া সমর্থন করার প্রয়োজন না হয় তবে এখনই এটি পরিচালনা করার পক্ষে এটি সাধারণ উপায়।
tvanfosson

3
REST এর নীতিগুলি লঙ্ঘন করার জন্য এটির অপব্যবহার না করার জন্য কেবল সাবধান হন।
ফ্রেড

1
খুব নিশ্চিত যে এটি কেবলমাত্র কাজ করছে কারণ আপনার Show()পদ্ধতিগুলির বিভিন্ন স্বাক্ষর রয়েছে। যদি এবং যখন আপনাকে গেট সংস্করণে তথ্য প্রেরণের দরকার হয় তখন আপনার গেট এবং পোস্ট সংস্করণগুলি একই স্বাক্ষর দিয়ে শেষ হয় এবং আপনাকে ActionNameএই পোস্টে উল্লিখিত বৈশিষ্ট্য বা অন্য কোনও ফিক্সের প্রয়োজন হবে।
স্কট ফ্রেলে

1
@ স্কটকে.ফ্রেলি এটি সত্য। তাদের যদি একই স্বাক্ষরের প্রয়োজন হয় তবে আপনাকে তাদের আলাদা আলাদা নাম দিতে হবে এবং এটি প্রয়োগ করতে হবে ActionNameAttribute। বাস্তবে, আমি খুব কমই এটির ক্ষেত্রে পেয়েছি।
tvanfosson

42

এখানে আপনি অন্য কিছু করতে পারেন ... আপনি এমন একটি পদ্ধতি চান যা প্যারামিটার রাখতে সক্ষম এবং নাও and

কেন এটি চেষ্টা করবেন না ...

public ActionResult Show( string username = null )
{
   ...
}

এটি আমার পক্ষে কাজ করেছে ... এবং এই একটি পদ্ধতিতে আপনি প্রকৃতপক্ষে আগত প্যারামিটার আছে কিনা তা পরীক্ষা করে দেখতে পারেন।


স্ট্রিংয়ের অবৈধ nullable সিনট্যাক্স অপসারণ এবং একটি ডিফল্ট প্যারামিটার মান ব্যবহার করার জন্য আপডেট করা হয়েছে।


6
( stringশূন্যযোগ্য হতে পারে না)
জোশ এম।

23
স্ট্রিং nullable হতে পারে। আসলে, এটি ইতিমধ্যে nlalable, শুধু প্রয়োজন নেই? '
অধ্যাপক

9
@ প্রফক - না, স্ট্রিং একটি রেফারেন্স টাইপ যা নালার হতে পারে। এটি "nullaable" নয়। নলাবলের অর্থ হ'ল আপনি নুলাবল <T> (অর্থাত্ টি?) ব্যবহার করছেন। জোশের বক্তব্যটি আপনি এটি রাখতে পারবেন না? স্ট্রিংয়ের পরে কারণ এটি কোনও মানের ধরণ নয় এবং নুলযোগ্য <T> কেবল মানের ধরণগুলি গ্রহণ করে।
এরিক ফানকেনবাশ

4
আমি এলোমেলোভাবে এই প্রশ্নে ফিরে আসার পথ খুঁজে পেয়েছি এবং তখন বুঝতে পেরেছি যে আমি উপরে মন্তব্যটি পোস্ট করেছি। এর কোন স্মৃতি নেই ... অদ্ভুত! এটি এখনও সত্য যে একটি stringহতে পারে না nullable; কিন্তু এটা হতে পারে null! যেভাবেই হোক আমি আন্তরিকতা ছাড়াই প্রাথমিক মন্তব্য পোস্ট করেছি।
জোশ এম

20

না, না এবং নং যান এবং নীচের নিয়ামক কোডটি চেষ্টা করুন যেখানে আমাদের "লোডকাস্টমার" ওভারলোড হয়েছে।

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

আপনি যদি "লোডকাস্টমার" ক্রিয়াটি চালিত করার চেষ্টা করেন তবে নীচের চিত্রটিতে প্রদর্শিত হিসাবে আপনি ত্রুটি পাবেন।

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

পলিমর্ফিিজম সি # প্রোগ্রামিংয়ের একটি অংশ, যখন এইচটিটিপি একটি প্রোটোকল। এইচটিটিপি বহুবচন বুঝতে পারে না। এইচটিটিপি ধারণা বা ইউআরএল এবং ইউআরএল নিয়ে কাজ করে শুধুমাত্র অনন্য নাম থাকতে পারে। সুতরাং এইচটিটিপি বহুবচন প্রয়োগ করে না implement

একই ঠিক করতে আমাদের "অ্যাকশননাম" বৈশিষ্ট্যটি ব্যবহার করতে হবে।

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }

        [ActionName("LoadCustomerbyName")]
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

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

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

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

উপরের উত্তরটি আমি এই কোডেপ্রজেক্ট নিবন্ধটি থেকে নিয়েছি -> এমভিসি অ্যাকশন ওভারলোডিং


এর জন্য ধন্যবাদ. আমার ধারণা আপনি গুণাবলীটি ব্যবহার না করে শুরু থেকে আলাদা ক্রিয়া নামটি ব্যবহার করতে পারেন use
ড্যান

1
@ ড্যান তবে তারপরে আমাদের সি # পাশের বহুবর্ষ নেই ph
শিবপ্রসাদ কৈরালা

আপনি সঠিক, কোনও নিয়ন্ত্রণকারী পদ্ধতি ওভারলোডিং নেই তবে HTTP এর সাথে এটি করার কিছুই নেই।
চ্যালকি

বিবৃতির জন্য ধন্যবাদ. +1 টি। সি # নয় বরং আরও এইচটিটিপি চিন্তা করা উচিত। ওও কৌশল নিয়ে ক্রিয়াগুলির কাছে যাওয়ার কোনও কারণ নেই।

15

এই সমস্যা কাটিয়ে উঠতে আপনি এমন একটি লিখতে পারেনActionMethodSelectorAttribute যা MethodInfoপ্রতিটি ক্রিয়াকলাপের জন্য পরীক্ষা করে এটি পোস্ট ফর্মের মানগুলির সাথে তুলনা করে এবং তারপরে যে কোনও পদ্ধতির জন্য ফর্মের মানগুলি মেলে না তা প্রত্যাখ্যান করে (অবশ্যই বোতামের নাম বাদে)।

এখানে একটি উদাহরণ দেওয়া হয়েছে: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

তবে এটি একটি ভাল ধারণা নয়।


"তবে এটি ভাল ধারণা নয়।" কেন না?
সারবিরাস

@ সার্ব্রাস কারণ এটি একটি ভয়াবহ হ্যাক এবং পরের ব্যক্তি যিনি আপনার নিয়ামক কোডটি দেখছেন এটি একটি খুব অ-মানক পদ্ধতির দ্বারা বিভ্রান্ত হবে।
ইয়ান মেরার

হেই, যথেষ্ট ফর্সা।
সেরব্রাস

14

যতদূর আমি জানি আলাদা আলাদা http পদ্ধতি ব্যবহার করার সময় আপনার কেবল একই পদ্ধতি থাকতে পারে।

অর্থাত

[AcceptVerbs("GET")]
public ActionResult MyAction()
{

}

[AcceptVerbs("POST")]
public ActionResult MyAction(FormResult fm)
{

}

2
ওভারলোডের সাথে সজ্জাটির কোনও সম্পর্ক নেই। এটি পরামিতিগুলির তালিকা যা ওভারলোডিংয়ের অনুমতি দেয়।
স্কাই স্যান্ডার্স

@ স্কাইস্যান্ডার্স আমি একমত নই, পরামিতি-ভিত্তিক ওভারলোডিং এমভিসি নিয়ন্ত্রণকারী পদ্ধতিতে কাজ করে না - আপনি কি এর কার্যকরী উদাহরণ পেয়েছেন? চিয়ার্স।
চকী

[HttpPost]পরিবর্তে বৈশিষ্ট্যটি ব্যবহার করুন [AcceptVerbs("POST")]
ফ্রেড

9

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

প্রথমে App_Start / RouteConfig.cs এ অ্যাট্রিবিউট রাউটিং সক্ষম করুন।

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );            
    }
}

Controlচ্ছিকভাবে আপনার নিয়ামক শ্রেণিকে একটি ডিফল্ট রুট উপসর্গ দিয়ে সাজান।

[RoutePrefix("Returns")]
public class ReturnsController : BaseController
{
    //.......

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

[HttpGet]
// Returns
public ActionResult Index()
{
    //.....
}

[HttpGet]
[Route("View")]
// Returns/View
public ActionResult View()
{
    // I wouldn't really do this but it proves the concept.
    int id = 7026;
    return View(id);
}

[HttpGet]
[Route("View/{id:int}")]
// Returns/View/7003
public ActionResult View(int id)
{
    //.....
}

[HttpGet]
[Route("View/{id:Guid}")]
// Returns/View/99300046-0ba4-47db-81bf-ba6e3ac3cf01
public ActionResult View(Guid id)
{
    //.....
}

আশা করি এটি সহায়তা করে এবং কাউকে ভুল পথে পরিচালিত করছে না। :-)


চমৎকার কাজ! আমি কেবল এই ইস্যুতে দৌড়েছি, আপনি আমাকে বাঁচিয়েছেন! ওয়েব ফোরামের সাথে আমারও "এক্স" বছর রয়েছে - তাই এখনও খুব শিখার বক্ররেখা। এখনকার দিনে এমভিসি ছাড়া চাকরি পাওয়া যাবে না
তেজ উইংফিল্ড

4

আপনি ActionResultউভয়কেই মোকাবেলায় একক ব্যবহার করতে পারেন Postএবং Get:

public ActionResult Example() {
   if (Request.HttpMethod.ToUpperInvariant() == "GET") {
    // GET
   }
   else if (Request.HttpMethod.ToUpperInvariant() == "POST") {
     // Post  
   }
}

আপনার Getএবং Postপদ্ধতিগুলির স্বাক্ষর মিলে গেলে দরকারী ।


1
হুঁ, আবার সদৃশ একটি চাকা পুনর্নির্মাণ, কিন্তু এবার একটি বর্গক্ষেত্র আকারে। কেন কেবল [এইচটিটিপিপোস্ট / গেট] বৈশিষ্ট্যগুলি ব্যবহার করবেন না?
SOReader

এটি কিছুক্ষণ হয়ে গেছে তবে আমি মনে করি এটি আমি করেছি কারণ এমভিসি দুটি পৃথক পদ্ধতির মধ্যে মেলানো সিগের সাথে পার্থক্য করছিল না। আমি এইচটিপিপিস্টিটি অ্যাট্রিবিউটটি ব্যবহার করছিলাম, যদিও আমি অন্য পদ্ধতিতে এইচটিপিগেটটি রাখছিলাম না ..
দেবদ্যাভ

@ ডেভডেভ পাশাপাশি উভয় পদ্ধতিকেই বিশিষ্ট করার জন্য নিশ্চিত হয়ে নিন যে আপনি system.web.mvc থেকে বৈশিষ্ট্যগুলি ব্যবহার করছেন - এবং system.web.http থেকে নয়!
চকী

4

আমি এখনই এই প্রশ্নটি নিয়ে এসেছি এবং এখন এটি বেশ পুরানো হলেও এটি এখনও খুব প্রাসঙ্গিক। হাস্যকরভাবে, এই থ্রেডের একটি সঠিক মন্তব্য পোস্টটি লেখার সময় এমভিসিতে একটি স্ব-স্বীকৃত শিক্ষানবিস পোস্ট করেছিলেন। এমনকি এএসপি ডট নেটও পুরোপুরি সঠিক নয়। আমার একটি বড় প্রকল্প রয়েছে এবং আমি সাফল্যের সাথে অ্যাকশন পদ্ধতিগুলি ওভারলোড করি।

যদি কেউ সাধারণ {নিয়ামক} / {ক্রিয়া} / {আইডি} ডিফল্ট রুট প্যাটার্নের বাইরে রাউটিংটি বুঝতে পারে তবে এটি সম্ভবত স্পষ্ট হতে পারে যে কোনও অনন্য প্যাটার্ন ব্যবহার করে নিয়ামক পদক্ষেপগুলি ম্যাপ করা যায়। এখানে কেউ পলিমারফিজম সম্পর্কে কথা বলেছিলেন এবং বলেছেন: "এইচটিটিপি পলিমারফিজম বোঝে না", তবে রাউটিংয়ের এইচটিটিপি-র কোনও সম্পর্ক নেই। এটি, সহজভাবে বলা যায়, স্ট্রিং প্যাটার্ন মিলের জন্য একটি প্রক্রিয়া।

এই কাজটি করার সর্বোত্তম উপায় হ'ল রাউটিং বৈশিষ্ট্যগুলি ব্যবহার করা, উদাহরণস্বরূপ:

[RoutePrefix("cars/{country:length(3)}")]
public class CarHireController
{
    [Route("{location}/{page:int=1}", Name = "CarHireLocation")]
    public ActionResult Index(string country, string location, int page)
    {
        return Index(country, location, null, page);
    }

    [Route("{location}/{subLocation}/{page:int=1}", Name = "CarHireSubLocation")]
    public ActionResult Index(string country, string location, string subLocation, int page)
    {
        //The main work goes here
    }
}

এই ক্রিয়াগুলি url এর মতো যত্ন নেবে /cars/usa/new-yorkএবং /cars/usa/texas/dallasযা যথাক্রমে প্রথম এবং দ্বিতীয় সূচক ক্রিয়াকলাপগুলিতে ম্যাপ করবে।

এই উদাহরণস্বরূপ নিয়ন্ত্রকের পরীক্ষা করে দেখা যায় যে এটি উপরে বর্ণিত ডিফল্ট রুটের ধরণ ছাড়িয়ে গেছে beyond ডিফল্টটি ভাল কাজ করে যদি আপনার ইউআরএল কাঠামোটি আপনার কোড নামকরণের কনভেনশনগুলির সাথে হুবহু মিলে যায় তবে এটি সর্বদা ক্ষেত্রে হয় না। কোডটি ডোমেনের বর্ণনামূলক হওয়া উচিত তবে ইউআরএলগুলি প্রায়শই আরও এগিয়ে যেতে হয় কারণ তাদের বিষয়বস্তু অন্যান্য মাপদণ্ডের উপর ভিত্তি করে হওয়া উচিত যেমন এসইও প্রয়োজনীয়তা।

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

গুরুত্বপূর্ণ দ্রষ্টব্য একটি ত্রুটিটি হ'ল ওভারলোড হওয়া ক্রিয়াকলাপগুলির জন্য url উত্পন্ন করার জন্য রাউটিং ব্যবহার করা কোনও ক্রমের নামের উপর ভিত্তি করে কাজ করে না, যেমন, UrlHelper.Action ব্যবহার করার সময়। যদি কেউ নামযুক্ত রুটগুলি ব্যবহার করে তবে এটি কাজ করে, এবং সম্মানিত উত্স অনুসারে নামযুক্ত রুটগুলি ব্যবহার করা হ'ল যেকোন উপায়ে যাওয়ার উপায় ( http://haacked.com/archive/2010/11/21/ নাম-routes-to-the- rescue.aspx/ )।

শুভকামনা!


3

একই নামটি আলাদা নামের সাথে ব্যবহার করতে আপনি [অ্যাকশননেম ("নতুনঅ্যাকশননাম")] ব্যবহার করতে পারেন:

public class HomeController : Controller
{
    public ActionResult GetEmpName()
    {
        return Content("This is the test Message");
    }

    [ActionName("GetEmpWithCode")]
    public ActionResult GetEmpName(string EmpCode)
    {
        return Content("This is the test Messagewith Overloaded");
    }
}

2

এর জন্য আমার একটি ওভারলোড দরকার:

public ActionResult Index(string i);
public ActionResult Index(int groupId, int itemId);

আমি যথেষ্ট কাজ করতে গিয়ে শেষ করেছি সেখানে যথেষ্ট যুক্তি রয়েছে:

public ActionResult Index(string i, int? groupId, int? itemId)
{
    if (!string.IsNullOrWhitespace(i))
    {
        // parse i for the id
    }
    else if (groupId.HasValue && itemId.HasValue)
    {
        // use groupId and itemId for the id
    }
}

এটি একটি নিখুঁত সমাধান নয়, বিশেষত যদি আপনার অনেক যুক্তি থাকে তবে এটি আমার পক্ষে ভাল কাজ করে।


1

আমি আমার আবেদনেও একই সমস্যার মুখোমুখি হয়েছি। কোনও পদ্ধতির তথ্য মোডিফায়িগ ছাড়াই, আমি অ্যাকশন শিরোনামে [অ্যাকশননেম ("সামারইমিংফুলনাম")] সরবরাহ করেছি। ব্যাপারতি পুনঃসংশোধিত

[ActionName("_EmployeeDetailsByModel")]
        public PartialViewResult _EmployeeDetails(Employee model)
        {
            // Some Operation                
                return PartialView(model);
            }
        }

[ActionName("_EmployeeDetailsByModelWithPagination")]
        public PartialViewResult _EmployeeDetails(Employee model,int Page,int PageSize)
        {

                // Some Operation
                return PartialView(model);

        }

0

ভার্চুয়াল হিসাবে বেস পদ্ধতি তৈরি করুন

public virtual ActionResult Index()

ওভাররাইড হিসাবে ওভাররাইড পদ্ধতিটি তৈরি করুন

public override ActionResult Index()

সম্পাদনা: এই স্পষ্টতই কেবল তখনই প্রযোজ্য হয় যদি ওভাররাইড পদ্ধতিটি কোনও উদ্ভূত শ্রেণিতে থাকে যা ওপির উদ্দেশ্য না বলে মনে হয়।


2
আপনি সম্ভবত প্রশ্নটি ভুল বুঝছেন। ওপি অনুরূপ নিয়ামকটিতে পদ্ধতিটি ওভারলোডিং সম্পর্কে জিজ্ঞাসা করছে, ডাইরেক্ট ক্লাসে ওভাররাইড না করে।
টেক্কা

@ অ্যান্ডিহ: উভয় পদ্ধতিই যদি নিয়ামক হয় তবে কি হবে?
ধর্মিক ভান্ডারী

0

আমি এই উত্তরটি অন্য থ্রেডে পোস্ট করা পছন্দ করি

আপনি যদি অন্য কোনও নিয়ামকের কাছ থেকে উত্তরাধিকারী হন এবং বেস কন্ট্রোলার থেকে কোনও অভিযোগকে ওভাররাইড করতে চান তবে এটি প্রধানত ব্যবহৃত হয়

এএসপি.নেট এমভিসি - বিভিন্ন পরামিতিগুলির সাথে একটি ক্রিয়াকে ওভাররাইড করে


0

প্রতিটি নিয়ামক পদ্ধতির জন্য কেবলমাত্র একটি পাবলিক স্বাক্ষর অনুমোদিত। আপনি যদি এটি ওভারলোড করার চেষ্টা করেন তবে এটি সংকলন করবে তবে আপনি যে রান-টাইম ত্রুটিটি পেয়েছেন তা পেয়ে যাচ্ছেন।

আপনি যদি বিভিন্ন ক্রিয়া ব্যবহার করতে রাজি না হন (যেমন [HttpGet]এবং এর মতো[HttpPost] ওভারলোডেড পদ্ধতিগুলি (যা কাজ করবে) আলাদা করতে বা রাউটিং পরিবর্তন বৈশিষ্ট্যগুলি) , তবে অবশিষ্টটি হ'ল আপনি হয় অন্য নামের সাথে অন্য পদ্ধতি সরবরাহ করতে পারেন, বা আপনি পারেন বিদ্যমান পদ্ধতির ভিতরে প্রেরণ। আমি এটি কীভাবে করেছি তা এখানে:

আমি একবার এমন পরিস্থিতিতে এসেছি যেখানে আমাকে পিছনের সামঞ্জস্য বজায় রাখতে হয়েছিল। মূল পদ্ধতিটি দুটি পরামিতি প্রত্যাশা করেছিল, তবে নতুনটিতে কেবল একটি ছিল। ওভারলোডিং যেভাবে আমি প্রত্যাশা করেছিলাম তা কার্যকর হয়নি কারণ এমভিসি আর এন্ট্রি পয়েন্টটি খুঁজে পায় নি।

এটি সমাধান করার জন্য, আমি নিম্নলিখিতগুলি করেছি:

  1. 2 ওভারলোড হওয়া ক্রিয়াকলাপগুলি সর্বজনীন থেকে প্রাইভেটে পরিবর্তন করেছে
  2. একটি নতুন পাবলিক পদ্ধতি তৈরি করা হয়েছে যাতে "মাত্র" 2 টি স্ট্রিং প্যারামিটার রয়েছে। তিনি একজন প্রেরণকারীর ভূমিকা পালন করেছিলেন, যেমন:

    public ActionResult DoSomething(string param1, string param2)
    {
        if (string.IsNullOrEmpty(param2))
        {
            return DoSomething(ProductName: param1);
        }
        else
        {
            int oldId = int.Parse(param1);
            return DoSomething(OldParam: param1, OldId: oldId);
        }
    }
    
    
    private ActionResult DoSomething(string OldParam, int OldId)
    {
        // some code here
        return Json(result);
    }
    
    
    private ActionResult DoSomething(string ProductName)
    {
        // some code here
        return Json(result);
    }

অবশ্যই, এটি একটি হ্যাক এবং পরে এটি পুনঃসংশ্লিষ্ট করা উচিত। তবে আপাতত, এটি আমার পক্ষে কাজ করেছিল।

আপনি এর মতো একটি প্রেরকও তৈরি করতে পারেন:

public ActionResult DoSomething(string action, string param1, string param2)
{
    switch (action)
    {
        case "update":
            return UpdateAction(param1, param2);
        case "remove":
            return DeleteAction(param1);
    }
}

আপনি দেখতে পাচ্ছেন যে আপডেটএকশনের জন্য 2 টি পরামিতি প্রয়োজন, যখন মুছুন অ্যাকশনটির কেবল একটি প্রয়োজন।


0

দেরি করার জন্য দুঃখিত. আমি একই সমস্যার সাথে ছিলাম এবং ভাল উত্তরগুলির সাথে একটি লিঙ্ক পেয়েছি, এটি কি নতুন ছেলেদের সহায়তা করতে পারে

বাইনারিআইন্টারলেট ওয়েবসাইট এবং লেখকদের জন্য সমস্ত ক্রেডিট

মূলত, সেখানে চার পরিস্থিতিতে আছেন: differents ক্রিয়া ব্যবহার , রাউটিং ব্যবহার , জমিদার [NoAction] এর সাথে অ্যাট্রিবিউট উপলক্ষে এবং [ActionName] এর সাথে কর্মের বৈশিষ্ট্য নাম পরিবর্তন

সুতরাং, এটি আপনার প্রয়োজনীয়তা এবং আপনার পরিস্থিতি নির্ভর করে।

যাই হোক না কেন, লিঙ্কটি অনুসরণ করুন:

লিঙ্ক: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx


-1

যদি এটি বিভিন্ন মডেলের সাথে বেশ কয়েকটি ক্রিয়াকলাপে পোস্ট করা বেশ কয়েকটি দর্শনের জন্য একটি জিইটি অ্যাকশন ব্যবহার করার চেষ্টা করা হয়, তবে প্রতিটি পোষ্ট ক্রিয়াকলাপের জন্য একটি জিইটি অ্যাকশন যুক্ত করার চেষ্টা করুন যা রিফ্রেশে 404 রোধ করার জন্য প্রথম জিইটি-র পুনর্নির্দেশ করে।

দীর্ঘ শট কিন্তু সাধারণ দৃশ্য।

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