আমি কীভাবে এএসপি.নেট এমভিসি নিয়ন্ত্রক অ্যাকশন প্যারামিটার হিসাবে কোনও অ্যারে গ্রহণ করব?


86

আমার কাছে একটি ASP.net এমভিসি কন্ট্রোলার রয়েছে যার নীচে Designsস্বাক্ষর সহ একটি ক্রিয়া রয়েছে:

public ActionResult Multiple(int[] ids)

তবে, আমি যখন ইউআরএলটি ব্যবহার করে এই ক্রিয়াটিতে নেভিগেট করার চেষ্টা করি:

http://localhost:54119/Designs/Multiple?ids=24041,24117

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

উত্তর:


153

ডিফল্ট মডেল বাইন্ডারটি এই urlটিকে প্রত্যাশা করে:

http://localhost:54119/Designs/Multiple?ids=24041&ids=24117

সাফল্যের সাথে আবদ্ধ করার জন্য:

public ActionResult Multiple(int[] ids)
{
    ...
}

এবং যদি আপনি এটি কমা দ্বারা পৃথক মানগুলির সাথে কাজ করতে চান তবে আপনি একটি কাস্টম মডেল বাইন্ডার লিখতে পারেন:

public class IntArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null || string.IsNullOrEmpty(value.AttemptedValue))
        {
            return null;
        }

        return value
            .AttemptedValue
            .Split(',')
            .Select(int.Parse)
            .ToArray();
    }
}

এবং তারপরে আপনি কোনও বিশেষ ক্রিয়া যুক্তিতে এই মডেল বাইন্ডার প্রয়োগ করতে পারেন:

public ActionResult Multiple([ModelBinder(typeof(IntArrayModelBinder))] int[] ids)
{
    ...
}

বা এটিকে আপনার সমস্ত পূর্ণসংখ্যা অ্যারের প্যারামিটার বিশ্বব্যাপী প্রযোজ্য Application_Startমধ্যে Global.asax:

ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());

এবং এখন আপনার নিয়ামক ক্রিয়াটি দেখতে এইরকম হতে পারে:

public ActionResult Multiple(int[] ids)
{
    ...
}

4
আমি নিখোঁজ ছিলাম [FromUri]public ActionResult Multiple([FromUri]int[] ids) {} (জিইটি)
C0d1ngJammer

4
@ ডারিন কি বিশ্বব্যাপী কাস্টম বাঁধাই প্রয়োগ করার কোনও উপায় আছে তবে নির্দিষ্ট ক্রিয়াটির জন্য কেবল তা উপেক্ষা করবেন? : আমি যে কাজ করতে একটি উপায় খুঁজে পাইনি stackoverflow.com/questions/45379040/...
এ কে ডি

15

ডারিন দিমিত্রভের উত্তরটি প্রসারিত করার জন্য , আপনি যে কোনও কিছু থেকে দূরে যেতে পারেন তা হ'ল stringআপনার ইউআরএল প্যারামিটারে একটি সহজ গ্রহণ করে এবং এটিকে নিজেই একটি অ্যারেতে রূপান্তর করা:

public ActionResult Multiple(string ids){
  int[] idsArray = ids.Split(',').Select(int.Parse).ToArray();
  /* ...process results... */
}

এটি করার সময় আপনি যদি বিশ্লেষণ ত্রুটি পেয়ে থাকেন (কারণ কেউ আপনাকে একটি ত্রুটিযুক্ত অ্যারে পাস করেছে), আপনি আপনার ব্যতিক্রম হ্যান্ডলারটিকে 400 Bad Requestডিফল্টের পরিবর্তে একটি ত্রুটি ফিরিয়ে আনতে পারেন , 404 Not Foundশেষ পয়েন্টটি পাওয়া না গেলে এমভিসি ফিরে আসে এমন আরও বন্ধুত্বপূর্ণ ত্রুটি।


9

আপনি এই ইউআরএল ফর্ম্যাটটিও ব্যবহার করতে পারেন এবং এএসপি.নেট এমভিসি আপনার জন্য সবকিছু করবে। তবে, ইউআরএল এনকোডিং প্রয়োগ করতে ভুলবেন না।

?param1[0]=3344&param1[1]=2222

6

গ্রোকের ইউআরএল স্ট্রিংটি কোথা থেকে আসছিল তা আমি জানি না, তবে কিছু জাভাস্ক্রিপ্ট আমার কন্ট্রোলার / ক্রিয়াকে কল করে আমার একই সমস্যা হয়েছিল। এটি nullএকাধিক-বাছাই করা তালিকা থেকে 1, বা অনেকগুলি "আইডি" তৈরি করবে (যা আমি ভাগ করতে চলেছি তার সমাধানের জন্য অনন্য।

আমি দারিনের কাস্টম মডেল বাইন্ডারকে অনুলিপি / আটকানো এবং আমার অ্যাকশন / প্যারামিটার সজ্জিত করেছি, কিন্তু এটি কার্যকর হয়নি। আমি এখনও nullমূল্যবান int[] ids। এমনকি "নিরাপদ" ক্ষেত্রে যেখানে আমার আসলে অনেকগুলি আইডি ছিল।

আমি ASP.NET MVC বন্ধুত্বপূর্ণ প্যারামিটার অ্যারের মতো জাভাস্ক্রিপ্ট পরিবর্তন করে শেষ করেছি

?ids=1&ids=2

যদিও আমাকে কিছু নির্বোধ জিনিস করতে হয়েছিল

ids || []                 #=> if null, get an empty array
[ids || []]               #=> if a single item, wrap it in an array
[].concat.apply([], ...)  #=> in case I wrapped an array, flatten it

সুতরাং, পুরো ব্লক ছিল

ids = [].concat.apply([], [ids || []])
id_parameter = 'ids=' + ids.join('&ids=')

এটি অগোছালো তবে জাভাস্ক্রিপ্টে আমাকে এই প্রথম হ্যাক করতে হয়েছিল।


4
এই শেষ বাক্যে "প্রথমবার" এর আগে 'না' অনুপস্থিত থাকলে কেবল কৌতূহলী। অন্যথায়, আপনি ভাগ্যবান!
ডিসি শ্যাননন

4
@ ডিসিএস শ্যাননন: হাহাহা, আমি আপনার বক্তব্য দেখছি! তবে, এটি আমার প্রথমবার ছিল। আমি নিশ্চিত নই যে এই জাতীয় জিনিসটি স্বাভাবিক কিনা বা আমি যদি বোর্ডের বাইরে চলে যাই।
অ্যান্টনি মাষ্ট্রেয়ান

1

। নেট কোর উত্তর

সাম্প্রতিক সময়ে এখানে যারা আসছেন তাদের জন্য আপনি এটি করতে পারেন et নেট কোর এর সাথে:

http://localhost:54119/Designs/Multiple?ids=24041&ids=24117

এবং:

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