AJAX এর মাধ্যমে এমভিসি অ্যাকশনে অ্যারে পাস করুন


123

আমি এজেএক্স এর মাধ্যমে এমভিসি অ্যাকশনে একটি ইনট (বা আইনিউনামেবল) ইনট পাস করার চেষ্টা করছি এবং আমার একটু সাহায্য দরকার।

জাভাস্ক্রিপ্ট হয়

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

এবং নিয়ামক পদক্ষেপ হয়

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

এই মুহুর্তে অনুরোধটি হিসাবে ফর্ম্যাট করা হয়েছে

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

সুতরাং আমি প্রায় সেখানে রয়েছি, যদি আমি বর্গাকার বন্ধনী বন্ধ করি তবে আমি সঠিক প্রতিক্রিয়া পেয়েছি। আমার কীভাবে সেই অ্যারেটি পাস করা উচিত যাতে নিয়ামক এটি কী তা বুঝতে পারে?

আপনার সাহায্যের জন্য অনেক ধন্যবাদ

ডেভ

উত্তর:


149

কল কল করার আগে সনাতন সম্পত্তিটিকে সত্যে সেট করুন Set অর্থাৎ,

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

3
ধন্যবাদ! আপনি দয়া করে traditionalতিহ্যবাহী এবং অপ্রচলিত এজাক্সের মধ্যে পার্থক্যটির রূপরেখা দিতে পারেন? আমি আমার অ্যাপ্লিকেশনটির বাকি অংশগুলিতে কী করছি তা আরও ভাল করে বুঝতে চাই।
টম বিচ

5
আপনি একক কলে প্রথাগত সেটিংটি যুক্ত করতে পারেন। তারপরে এটি
বিশ্রামগুলিকে

1
এই উত্তরটি সঠিক, তবে আপনি যদি একটি একক কলের জন্য "ট্র্যাডিশনাল" সেট করতে পছন্দ করেন তবে @ রিওনওলিয়ামস উত্তরটি দেখুন। উভয়কেই ভোট দেওয়া। ধন্যবাদ!
kzfabi

@ টম বিচ jQuery 1.4 হিসাবে, para। পরিম () পদ্ধতিটি গভীর স্ক্রিপ্টিং ভাষা এবং ফ্রেমগুলিতে যেমন পিএইচপি এবং রুবেল যেমন রেলগুলিতে সামঞ্জস্য করার জন্য গভীর বস্তুগুলিকে পুনরাবৃত্তিতে ক্রমিক করে তোলে। আপনি jQuery.ajaxSettings.traditional = সত্য সেট করে বিশ্বব্যাপী এই কার্যকারিতাটি অক্ষম করতে পারেন;
অ্যালেক্সি শেভিলভ

এই উত্তরগুলির কোনওটির জন্যই আমার পক্ষে কাজ করা হয়নি (সম্ভবত যে আমার কন্ট্রোলারটি একটি এপিআই নিয়ন্ত্রণকারী ছিল?), তবে আমি নিম্নলিখিত সমাধানের উত্তরটিতে আমার সমাধানটি পেয়েছি: stackoverflow.com/a/11100414/1751792
ভারসাম্যহীন

119

পোস্ট দেওয়ার চেষ্টা করার সময় আমার অতীতের সমস্যা ছিল (আপনি ঠিক কী করছেন তা নিশ্চিত নন, তবে আমি মনে করি অ্যারে পাস করার সময়, traditional তিহ্যবাহীটি সত্য হতে হবে

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });

4
কিছু লোকের পরামর্শ মতো, এটি কেবল একটি ওয়েবকনফিগ ফাইলটিতে বিশ্বব্যাপী অন্ধভাবে সেট করার চেয়ে অনেক ভাল so অন্যটির নিজস্ব বিভিন্ন অনুষ্ঠানের ভাল সেট রয়েছে তবে আপনার ডিফল্ট সমাধান হওয়া উচিত।
Panzercrisis

এটি কেবল অ্যাকশনারসাল্টে প্যারামিটার হিসাবে ডেটা প্রেরণ করছে, এটি কি অভ্যন্তরীণ অ্যাকশনারসাল্ট কোডটি চালাবে? উদাহরণস্বরূপ, যদি ডাটাবেসে অ্যারেফভ্যালুগুলি সন্নিবেশ করার জন্য কিছু কোড থাকে তবে সে কোডটি কি চলবে?
সৌরভ

এটি আমার যা প্রয়োজন ঠিক তা সমাধান করেছে। আমি এটি যুক্ত না করা এবং এগুলি আমার কন্ট্রোলারে রাখার আগ পর্যন্ত আমার অ্যারেগুলি আমার কন্ট্রোলারে শূন্য হয়ে ফিরে আসছিল যেমন: আইওনামেবল <স্ট্রিং> অ্যারে
সানএমসি

52

বেশ দেরি হলেও ভিন্ন ইতিমধ্যে এখানে উপস্থিত উত্তর:

পরিবর্তে $.ajaxআপনি শর্টহ্যান্ড ফাংশন ব্যবহার করতে চান $.getবা$.post , আপনি এইভাবে অ্যারে পাস করতে পারেন:


শর্টহ্যান্ড জিইটি

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

শর্টহ্যান্ড পোস্ট

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}


মন্তব্য:

  • বুলিয়ান প্যারামিটারটি $.paramসেই traditionalসম্পত্তির জন্য, যা এটির trueকাজ করা উচিত

2
প্রচলিত সম্পত্তি সম্পর্কে পরামর্শ দেওয়ার জন্য ধন্যবাদ। আমার সি # পরম কেন নালাম তা আমি বুঝতে পারি না। আমি দেখেছি যে "int []" টাইপটি সি # অ্যাকশন পদ্ধতিতেও কাজ করবে।
ড্যান র্যান্ডলফ 21

9

আপনার এটি ঠিক জরিমানা করতে সক্ষম হওয়া উচিত:

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

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

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

আপনার জন্য, দেখে মনে হচ্ছে আপনার নিজের মানগুলি আরও বাড়িয়ে তোলা দরকার। এমভিসির JSONValueProvider এটিকে আবার আপনার জন্য একটি অগণিত হিসাবে রূপান্তরিত করবে।


উত্তরের জন্য ধন্যবাদ তবে আমি মনে করি এটি দেখে মনে হচ্ছে trueতিহ্যগত সত্যের জন্য সেট করা দরকার। এইটিও কার্যকর হবে বলে আমি মনে করি উজ্জীবিত।
ডেভ

9

'ট্র্যাডিশনাল' বিকল্পটি ব্যবহারের উত্তরটি সঠিক। যারা আরও শিখতে চান তাদের জন্য আমি আরও কিছু পটভূমি তথ্য সরবরাহ করছি।

JQuery ডকুমেন্টেশন থেকে:

JQuery 1.8 হিসাবে, para .param () পদ্ধতিটি আর এর ডিফল্ট সেটিংস হিসাবে jQuery.ajaxSettings.traditional ব্যবহার করে না এবং ডিফল্ট হলে এটি মিথ্যা হয়ে যায়।

আপনি এখানে আরও পড়তে পারেন: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-Wersers এবং http://haacked.com/archive /2008/10/23/model-binding-to-a-list.aspx

আছে HTH


2

অন্য সব ব্যর্থ হলে...

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

আমি অবশেষে আমার সমাধানটি অন্য একটি এসও পোস্টে পেয়েছি এবং এটি আসলেই খুব সহজ ছিল: [FromUri]কন্ট্রোলারে অ্যারে প্যারামিটারের আগে কেবল টীকাটি যুক্ত করুন ( বন্ধুর টীকাগুলি এড়াতে আমাকে "traditionalতিহ্যবাহী" এজেএক্স সেটিংস ব্যবহার করেও কল করতে হয়েছিল )। আমি আমার অ্যাপ্লিকেশনটিতে ব্যবহৃত প্রকৃত কোডের জন্য নীচে দেখুন।


নিয়ন্ত্রক স্বাক্ষর:

নিয়ন্ত্রক স্বাক্ষর দ্রষ্টব্য: সি # তে টীকাটি হবে [FromUri]


javascript:

$.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);});

আসল ইউআরএল স্ট্রিং:

http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning

2

এখানে কিছুটা দেরি হয়ে গেছে তবে আমি এসএনএগের সমাধানটি আরও aj .ajax () এ ব্যবহার করতে পারি। কোডটি যদি এটি কাউকে সহায়তা করে:

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

1

যদি আপনি আমার মতো নেট নেট ফ্রেমওয়ার্ক এমভিসি থেকে এএসপি.নেট কোর এমভিসিতে স্থানান্তরিত হন তবে বিষয়গুলি কিছুটা পরিবর্তিত হয়েছে। এজাক্স কলটি স্ট্রিংফাই ব্যবহার করে কাঁচা বস্তুতে অবশ্যই হওয়া উচিত তার পরিবর্তে এর ডেটা পাস করার চেয়ে বেশি { vals: arrayOfValues }হওয়া উচিত JSON.stringify(arrayOfValues):

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify(arrayOfValues),
   success: function(data) { /* Whatever */ }
});

এএসপি.এনইটি কোর-এ অন্য যে পরিবর্তনটি করা হয়েছে তা হ'ল ক্রস-সাইট অনুরোধ জালিয়াতি রোধ করা যাতে একটি [FromBody]এমজিসি ক্রিয়াকলাপের জন্য একটি এজ্যাক্স পদ্ধতি থেকে অ্যাট্রিবিউট অবশ্যই অ্যাকশন প্যারামিটারে প্রয়োগ করা উচিত:

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )

আপনাকে ধন্যবাদ ডেটা পাঠানোর উপায়গুলির প্রতিটি ক্রিয়াকলাপ ব্যর্থ হওয়ার পরে এটি অবিশ্বাস্যরূপে সহায়ক ছিল!
নিবল্বিপিগ

0

আপনি যদি এএসপি.নেট কোর এমভিসি ব্যবহার করেন এবং বর্গাকার বন্ধনীগুলি IEnumerableহ'ল (জিক্যুরি "ট্র্যাডিশনাল" বিকল্পটি ব্যবহার না করে) পরিচালনা করতে চান তবে আমি খুঁজে পেয়েছি একমাত্র বিকল্পটি হ'ল কনট্রোলার পদ্ধতিতে ম্যানুয়ালি তৈরি করা ।

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));

0

আমি এসপ নেট কোর ২.২ এবং জ্যাকুরির সাথে কাজ করি এবং একটি সাধারণ অবজেক্ট ('মূল শ্রেণি') একটি ভিউ থেকে সাধারণ ডেটা ক্ষেত্র এবং কিছু অ্যারের সাথে একটি নিয়ামকের কাছে জমা দিতে হয়।
আমি সি # 'মেইন ক্লাস' সংজ্ঞায় অ্যারে যোগ করার সাথে সাথে (নীচে দেখুন) এবং এজাক্স (পোস্ট) এর উপরে (সঠিক ভরাট) অ্যারে জমা দেওয়ার সাথে সাথে পুরো অবজেক্টটি নিয়ামকের মধ্যে নালু হয়ে গেল।
প্রথমত, আমি ভেবেছিলাম, আমার অজ্যাক্স কলটির "traditionalতিহ্যবাহী: সত্য," অনুপস্থিতির কারণ ছিল, তবে এটি ঘটেনি।
আমার ক্ষেত্রে কারণটি # # প্রধান শ্রেণিতে সংজ্ঞা ছিল।
'প্রধান শ্রেণিতে' আমার ছিল:

public List<EreignisTagNeu> oEreignistageNeu { get; set; }

এবং ইরেনিগিসটাগনিউ হিসাবে সংজ্ঞায়িত হয়েছিল:

public class EreignisTagNeu
{
 public int iHME_Key { get; set; } 
}

আমাকে 'প্রধান শ্রেণিতে' সংজ্ঞাটি পরিবর্তন করতে হয়েছিল:

 public List<int> oEreignistageNeu { get; set; }

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


-3

আপনাকে অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করতে হবে:

//arrayOfValues = [1, 2, 3];  
$.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {...

এটি এমনকি int, দীর্ঘ বা স্ট্রিং আকারেও কাজ করে

public ActionResult MyAction(int[] arrayOfValues )

এটি সার্ভারে একটি অ্যারে প্রেরণের জন্য এমনকি সিনট্যাক্সও সঠিক নয়। আপনি কেবল একটি বস্তুটি অতিক্রম করছেন এবং ধরে নিচ্ছেন এটি একটি অ্যারে, যা আপনি সরবরাহ করেছেন এমনটি কখনও ঘটবে না, এটি একটি STRING।
টুইস্টার 1002
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.