এএসপি.নেট এমভিসি - নিয়ামককে পরামিতিগুলি প্রদান করে


105

আমার কাছে ক্রিয়া পদ্ধতি সহ একটি নিয়ামক রয়েছে:

public class InventoryController : Controller
{
    public ActionResult ViewStockNext(int firstItem)
    {
        // Do some stuff
    }
}

এবং আমি এটি চালানোর সময় আমি উল্লেখ করে একটি ত্রুটি পেয়েছি:

পরামিতি অভিধানে 'প্রথম আইটেম' প্যারামিটারের জন্য 'System.Int32' প্রকারের একটি বৈধ মান থাকে না। একটি প্যারামিটারকে alচ্ছিক করতে এর ধরণটি একটি রেফারেন্স টাইপ বা নলযোগ্য টাইপ হওয়া উচিত।

আমার এটি এক পর্যায়ে কাজ করেছে এবং আমি পরামিতি ছাড়াই ফাংশনটি চেষ্টা করার সিদ্ধান্ত নিয়েছি। নিয়ামকটি দৃistant় ছিল না তা জানতে পেরে আমি প্যারামিটারটি পিছনে রেখেছি, এখন যখন আমি পদ্ধতিটি কল করি তখন এটি প্যারামিটারটি চিনতে অস্বীকার করে।

অ্যাকশনটি কল করতে আমি এই url সিনট্যাক্সটি ব্যবহার করছি:

http://localhost:2316/Inventory/ViewStockNext/11

আমি এই ত্রুটিটি কেন পাব এবং এটি সংশোধন করার জন্য আমার কী করা দরকার?

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

উত্তর:


106

আপনার রাউটিংয়ের লাইনগুলি বরাবর সেট আপ করা দরকার {controller}/{action}/{firstItem}। আপনি যদি {controller}/{action}/{id}নিজের global.asax.csফাইলে ডিফল্ট হিসাবে রাউটিংটি রেখে গেছেন তবে আপনাকে প্রবেশ করতে হবে id

routes.MapRoute(
    "Inventory",
    "Inventory/{action}/{firstItem}",
    new { controller = "Inventory", action = "ListAll", firstItem = "" }
);

... বা এর কাছাকাছি কিছু


44
বা কেবল "ফার্স্ট আইটেম" এর নাম "আইডি" করুন
কাইল ট্রুবারম্যান

8
প্লাস এটি বিশ্বের জ্ঞানী MapRoute করার জন্য একটি সীমাবদ্ধতা বস্তুর যোগ করার জন্য, তাই মত হতে: new { firstItem = @"\d" }। প্যারামিটারটি কোনও ধরণের সংখ্যা হলে এটি কেবল গ্রহণ করবে । আপনি নিজের পছন্দ অনুসারে রেজেক্সকে সংশোধন করতে পারেন, এবং দশমিকের সংখ্যাও সীমাবদ্ধ করতে পারেন, new { firstItem = @"\d{4}" }এটির মতো: - এখন এটি কেবল 4 সংখ্যা দীর্ঘ হতে পারে। সম্পাদনা করুন: সম্পূর্ণরূপে পরিবর্তিত মানচিত্রের উদাহরণ: jsfiddle.net/HJRgT
ক্রিশ্চিয়ানবি

86

আপনি আইডিতে ফার্স্ট আইটেম পরিবর্তন করতে পারেন এবং এটি কার্যকর হবে

আপনি গ্লোবাল.অ্যাক্সেসের রাউটিংটি পরিবর্তন করতে পারেন (আমি এটি পুনরায় বলি না)

এবং, কেউ এটি উল্লেখ করেছে বিশ্বাস করতে পারে না, আপনি কল করতে পারেন:

http://localhost:2316/Inventory/ViewStockNext?firstItem=11

একটি @ ইউআরএল-এ কাজটি হবে:

@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});

আপনি কী করছেন তার ধরণের উপর নির্ভর করে শেষটি আরও উপযুক্ত হবে। এছাড়াও আপনার ভিউস্টকনেক্সট অ্যাকশন না করা এবং পরিবর্তে সূচক সহ একটি ভিউস্টক অ্যাকশন বিবেচনা করা উচিত। (আমার 2 টি)


15

ভিন্নরূপে বা অন্য কথায় করার Jarret মেয়ার এর উত্তর , আপনি 'আইডি' থেকে প্যারামিটার নাম পরিবর্তন করতে বা ভালো একটি রুট যোগ করার জন্য প্রয়োজন:

routes.MapRoute(
        "ViewStockNext", // Route name
        "Inventory/ViewStockNext/{firstItem}",  // URL with parameters
        new { controller = "Inventory", action = "ViewStockNext" }  // Parameter defaults
    );

কারণ হ'ল ডিফল্ট রুটটি কেবল কোনও পরামিতি বা 'আইডি' নামে পরিচিত একটি প্যারামিটার সহ ক্রিয়াগুলি অনুসন্ধান করে।

সম্পাদনা: হি, জরেট পোস্ট দেওয়ার পরে একটি রুটের উদাহরণ যুক্ত করেছে।


8

বা রুট অ্যাট্রিবিউট দিয়ে এটি করুন:

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}

এই সম্পত্তিটি পুরানো এমভিসি সংস্করণগুলির সাথে কাজ নাও করতে পারে।
স্যুট আতান পিএইচডি

এছাড়াও, এটি কাজ করার জন্য আপনাকে নিশ্চিত করতে হবে যে আপনি routes.MapMvcAttributeRoutes();অ্যাপ্লিকেশনটির RegisterRoutes(RouteCollection)পদ্ধতিতে ডেকেছেন (সাধারণত App_Start \ RouteConfig.cs এ মজাদার)। এটি ডিফল্টরূপে সেখানে নাও থাকতে পারে।
ড্যানিয়েল স্কট

7

হেডস্প্রিং একটি দুর্দান্ত গ্রন্থাগার তৈরি করেছে যা আপনাকে ক্রিয়াটির বৈশিষ্ট্যগুলিতে আপনার পরামিতিগুলিতে উপস্বকে যুক্ত করতে দেয়। এটি এর মতো দেখাচ্ছে:

[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
    // Do some stuff
}

এটির সাথে আপনাকে কেবল আলাদা প্যারামিটারের নামটি পরিচালনা করতে আপনার রাউটিংটি পরিবর্তন করতে হবে না। লাইব্রেরি এটি একাধিকবার প্রয়োগ করাও সমর্থন করে যাতে আপনি কয়েকটি প্যারামিটার বানান ম্যাপ করতে পারেন (আপনার সার্বজনীন ইন্টারফেসটি না ভেঙে রিফ্যাক্টরিং করার সময় সহজ)।

আপনি এটি নুগেটের কাছ থেকে পেতে পারেন এবং এটিতে জেফ্রে প্যালারমোর নিবন্ধটি এখানে পড়তে পারেন


7

public ActionResult ViewNextItem(int? id)idপূর্ণসংখ্যাকে একটি ক্ষুদ্র ধরণের করে তোলে , স্ট্রিংয়ের প্রয়োজন নেই <-> ইন্ট রূপান্তর।


3

এএসপি.নেট কোর ট্যাগ হেল্পার বৈশিষ্ট্যটি ব্যবহার করে:

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>

হাস্যকরভাবে সংক্ষিপ্ত উত্তরটি সেরা (এটির)।

1

এটি সম্পাদন করার আরও একটি উপায় রয়েছে (স্টিফেন ওয়ালথারের পেজার উদাহরণে আরও বিশদে বর্ণিত)

মূলত, আপনি ভিউটিতে একটি লিঙ্ক তৈরি করেন:

Html.ActionLink("Next page", "Index", routeData)

রুটডাটাতে আপনি নাম / মান জোড়া নির্দিষ্ট করতে পারেন (উদাঃ, রুটডাটা ["পৃষ্ঠা"] = 5), এবং নিয়ামক সূচক কার্যক্রমে সংশ্লিষ্ট পরামিতিগুলি মান গ্রহণ করে। এটাই,

public ViewResult Index(int? page)

পৃষ্ঠাটি 5 হিসাবে উত্তীর্ণ হবে I


0

"আইডি" এর বিশেষ চিকিত্সার কারণ হ'ল এটি ডিফল্ট রুট ম্যাপিংয়ে যুক্ত করা হয়। এটি পরিবর্তন করতে, Global.asax.cs এ যান এবং আপনি নিম্নলিখিত লাইনটি পাবেন:

routes.MapRoute ("Default", "{controller}/{action}/{id}", 
                 new { controller = "Home", action = "Index", id = "" });

এটিকে পরিবর্তন করুন:

routes.MapRoute ("Default", "{controller}/{action}", 
                 new { controller = "Home", action = "Index" });

0

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

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