রাউটিং: ক্রিয়াকলাপের জন্য বর্তমান অনুরোধ […] নিম্নলিখিত ক্রিয়া পদ্ধতির মধ্যে দ্ব্যর্থক


100

আমার কাছে একটি ভিউ বলা হয়েছে Browse.chtml, যেখানে ব্যবহারকারী কোনও অনুসন্ধান শব্দ প্রবেশ করতে পারে বা অনুসন্ধান শব্দটি ফাঁকা ছেড়ে দিতে পারে। অনুসন্ধান শব্দটিতে প্রবেশ করার সময়, পৃষ্ঠাটি আমি পরিচালনা করতে চাই http://localhost:62019/Gallery/Browse/{Searchterm} এবং যখন কিছুই প্রবেশ করা হয় না, তখন আমি ব্রাউজারটিতে নির্দেশ করতে চাই http://localhost:62019/Gallery/Browse/Start/Here

আমি এটি চেষ্টা করার পরে, আমি ত্রুটি পেয়েছি:

কন্ট্রোলার টাইপ 'গ্যালারীকন্ট্রোলার' উপর ক্রিয়া 'ব্রাউজ' করার জন্য বর্তমান অনুরোধটি নিম্নলিখিত ক্রিয়া পদ্ধতিগুলির মধ্যে দ্ব্যর্থক: সিস্টেম.ওয়েব.এমভিসি.অ্যাকশনআরসল্ট ব্রাউজ (সিস্টেম.স্ট্রিং) টাইপ অটো অ্যাপ_এমভিসি.কন্ট্রোলারস.গ্যালারি-কন্ট্রোলার সিস্টেম.ভেজ.এমভিসি.অ্যাকশনারস ব্রাউজ (Int32, System.String) টাইপ করুন AutoApp_MVC.Controllers.GalleryController

এমভিসির সাথে আমি যা করছি তা প্রথমবারের জন্য। এই মুহুর্তে আর কী কী চেষ্টা করা উচিত তা আমি নিশ্চিত নই।

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

গ্লোবাল.অ্যাক্স্যাক্স সি-তেও আমার এটি রয়েছে:

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });

উত্তর:


161

আপনার নিয়ামকটিতে একই নামের সাথে সর্বাধিক 2 টি ক্রিয়াকলাপ থাকতে পারে এবং এটি করার জন্য 1 টি অবশ্যই হবে [HttpPost]এবং অন্যটি অবশ্যই হবে [HttpGet]

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

যদিও আপনার 2 ব্রাউজ পদ্ধতিগুলি বৈধ সি # ওভারলোডস, এমভিসি অ্যাকশন পদ্ধতি নির্বাচনকারী কোন পদ্ধতিটি প্রার্থনা করবেন তা অনুধাবন করতে পারবেন না। এটি পদ্ধতির (বা তদ্বিপরীত) কোনও রুটের সাথে মিলের চেষ্টা করবে এবং এই অ্যালগোরিটমটি দৃ strongly়ভাবে টাইপ করা হয়নি।

আপনি কাস্টম রুটগুলি বিভিন্ন ক্রিয়াকলাপের পদ্ধতিতে নির্দেশ করে কী ব্যবহার করতে চান তা সম্পূর্ণ করতে পারেন:

... Global.asax এ

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

... এবং নিয়ামক মধ্যে ...

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

আপনি পৃথক করার জন্য কোনও এট্রিবিউট প্রয়োগ করে আপনি কন্ট্রোলারে একই নামের ক্রিয়াকলাপগুলি রাখতে সক্ষম হতে পারেন [ActionName]। উপরের মতো একই গ্লোবাল.এক্স্যাক্স ব্যবহার করে আপনার নিয়ামকটি এর পরে দেখতে পাবেন:

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

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

6
না, আপনার কোনও নতুন মতামত তৈরি করার দরকার নেই। উভয় ক্রিয়াকলাপের জন্য আপনি একই দৃষ্টিভঙ্গিকে পুনরায় ব্যবহার করতে পারেন। প্রথম যুক্তি হিসাবে কেবল দর্শন নামটি পাস করুনreturn View("Browse", summaries);
ডানলডুইগ

ওভারলোডিং কিছু ভবিষ্যতের প্রকাশে অন্তর্ভুক্ত করা হবে? রুটগুলি সংশোধন করা অতিরিক্ত কাজ এবং পরিবর্তনগুলি যখন করা হয় তখন অতিরিক্ত রক্ষণাবেক্ষণ প্রয়োজন।
ওল্ড গিজার

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

5

আমি জানি না কখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল এই সমাধানটি পাওয়া গেল তবে আপনি ব্যবহার করতে পারেন:

Request.QueryString["key"]

সুতরাং এটি আপনার সমস্যার জন্য ভাল কাজ করা উচিত:

[HttpGet]
public ActionResult Browse()
{
    if( Request.QueryString["id"] != null )        
        var summaries = /* search using id as search term */
    else /*assuming you don't have any more option*/
        var summaries = /* default list when nothing entered */

    return View(summaries);
} 

2

ডিফল্ট রুটের আগে রুটকনফিগ.সি.কে নিম্নলিখিত কোড যুক্ত করুন

routes.MapMvcAttributeRoutes();

এবং নিয়ামকটিতে রুটের বৈশিষ্ট্যগুলি যুক্ত করুন:

    [Route("Cars/deteals/{id:int}")]
    public ContentResult deteals(int id)
    {
        return Content("<b>Cars ID Is " + id + "</b>");
    }

    [Route("Cars/deteals/{name}")]
    public  ContentResult deteals(string name)
    {
        return Content("<b>Car name Is " + name + "</b>");

    }

1

আমি মনে করি যে বিন্দুটি তৈরি হচ্ছে তা হ'ল অনুরোধ শ্রেণিটি ব্যবহার করে আপনার কোয়েস্ট্রিং পরামিতিগুলির জন্য স্পষ্টভাবে পরীক্ষা করার দরকার নেই।

এমভিসি আপনার জন্য ম্যাপিং করে (যদি আপনি আপনার এমভিসি রুটে গুরুতর পরিবর্তন না করেন)।

এইভাবে একটি ক্রিয়া লিঙ্ক পাথ

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

প্যারামিটার সংজ্ঞায়িত করে আপনার (পৃষ্ঠ) নিয়ামকের কাছে স্বয়ংক্রিয়ভাবে উপলব্ধ হবে:

public ActionResult Logout(string DestinationUrl)

এমভিসি কাজটি করে।

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