আমি কীভাবে কোনও ফর্ম ছাড়াই এএসপি.নেট এমভিসি কন্ট্রোলারে একটি স্ট্রিংয়ের অ্যারে পোস্ট করতে পারি?


185

আমি নিজেকে এএসপি.নেট এমভিসি এবং জ্যাকিউয়ারি শেখানোর জন্য একটি ছোট অ্যাপ তৈরি করছি এবং পৃষ্ঠাগুলির একটি হ'ল একটি আইটেমের একটি তালিকা যা কিছুকে নির্বাচিত করা যেতে পারে। তারপরে আমি জ্যাকুয়ের পোস্ট ফাংশনটি ব্যবহার করে নির্বাচিত আইটেমগুলির আইডিসমুক্ত আমার নিয়ামককে একটি বাটন টিপতে এবং একটি তালিকা (বা সমমানের কিছু) প্রেরণ করতে চাই।

আমি নির্বাচিত উপাদানগুলির আইডির সাথে একটি অ্যারে পেতে সক্ষম হয়েছি এবং এখন আমি এটি পোস্ট করতে চাই। এটি করার একটি উপায় হ'ল আমার পৃষ্ঠায় একটি গোপন মান সহ একটি ডামি ফর্ম রাখা এবং তারপরে নির্বাচিত আইটেমগুলির সাথে লুকানো মান সেট করা এবং সেই ফর্মটি পোস্ট করা; যদিও এটি দেখতে চটকদার।

অ্যারেটিকে সরাসরি কন্ট্রোলারে প্রেরণ করে কি এটি অর্জনের আরও পরিষ্কার উপায় আছে? আমি কয়েকটি ভিন্ন জিনিস চেষ্টা করেছি তবে দেখে মনে হচ্ছে যে নিয়ামক এটি প্রাপ্ত ডেটা ম্যাপ করতে পারে না। এখন পর্যন্ত কোডটি এখানে:

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}

এবং তারপরে আমার কন্ট্রোলারটি দেখতে এটির মতো লাগে

public ActionResult GenerateList(List<string> values)
{
    //do something
}

আমি যেটি পেয়েছি তা নিয়ামক প্যারামিটারের "নাল" a

কোন টিপস?


যদিও, আপনি ব্যবহার করে একই ডেটা অ্যাক্সেস করতে পারেনRequest["values[]"]
টোকো

উত্তর:


246

আমি করেছি এমন একটি পরীক্ষার অ্যাপ্লিকেশনটির কোড অন্তর্ভুক্ত করার জন্য আমি আমার প্রতিক্রিয়া পরিবর্তন করেছি।

আপডেট: আমি 'ট্র্যাডিশনাল' সেটিংসটিকে সত্যে সেট করতে jQuery আপডেট করেছি যাতে এটি আবার কাজ করবে (@ ডাস্টিনডাভিস'র উত্তর অনুসারে)।

প্রথম জাভাস্ক্রিপ্ট:

function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };

    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}

এবং আমার নিয়ামক শ্রেণিতে কোডটি এখানে রয়েছে:

public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}

আমি যখন জাভাস্ক্রিপ্ট ফাংশন বলি, আমি "তালিকার প্রথম আইটেম: 'আইটেম 1'" বলে একটি সতর্কতা পাই। আশাকরি এটা সাহায্য করবে!


3
এটি উত্তম যে আমি এই উত্তরটি পেয়েছি, এখন আমি গাইডের অ্যারে প্রেরণ করতে সক্ষম হয়েছি এবং অ্যাকশন তাদের <গুয়েড> তালিকাতে গ্রহণ করে। ধন্যবাদ
Tx3

43
এখানে দুটি গুরুত্বপূর্ণ বিষয় লক্ষণীয়। 1) ডেটা টাইপ: "জসন" 2।) Traditionalতিহ্যবাহী: সত্য। তাদের স্ট্রিং অ্যারে ছাড়া অ্যাকশন পদ্ধতিতে পাস হবে না
থানিগাইনাথন

1
নোট করুন যে dataType: 'JSON'jQuery এর প্রতিক্রিয়াটিকে JSON হিসাবে পার্স করার চেষ্টা করেছে এবং এটি বৈধ JSON না হলে ত্রুটি হবে।
সেনেট

8
@ থানিগাইনাথন dataType: 'json'রিটার্ন টাইপের জন্য এবং এ্যাকশনে অ্যারে প্রেরণের প্রয়োজন হয় না। contentType: "application/json; charset=utf-8", এক, তবে কিছু ক্ষেত্রে এর মতো প্রয়োজন হয় না।
রুচান

1
@ Emzero ব্যবহারvar postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
নিক এম

108

এফওয়াইআই: জিকুয়েরি তাদের পোস্ট ডেটা সিরিয়ালাইজ করার পদ্ধতি পরিবর্তন করেছে।

http://forum.jquery.com/topic/nested-param-serialization

আপনাকে 'ট্র্যাডিশনাল' সেটিংসটি সত্য, অন্য জ্ঞানের কাছে সেট করতে হবে

{ Values : ["1", "2", "3"] }

হিসাবে আসবে

Values[]=1&Values[]=2&Values[]=3

পরিবর্তে

Values=1&Values=2&Values=3

8
এটি এমন একটি জিনিস যা আমাকে কিছুক্ষণের জন্য মাথা ঘষে। সেটিংটি $.ajax({ ..., traditional: true});traditionalতিহ্যবাহী সিরিয়ালায়নে ফিরে যেতে সহায়তা করবে।
জুহান_h

ASP.NET MVC রুটটি সঠিকভাবে স্ট্রিং মানগুলির একটি সাধারণ জেএস অ্যারে গ্রাস করার জন্য আমার এটি প্রয়োজন।
ব্র্যান্ডনজি

আপনার উত্তরটি সত্যই সহায়ক। আমারও একই অবস্থা তবে তা আছে ints। আমি যখন ব্যবহার করি তখন traditional: trueএটি কার্যকর হয়, আপনার উত্তর এবং লিঙ্কটি এর কারণ ব্যাখ্যা করে। আমি ব্যবহার type: "POST"না করেও এটি কাজ করে traditional: true। কেন এমন? আপনি দয়া করে বিস্তারিত বলতে পারেন। FYI আমি Asp.Net Mvc ব্যবহার করছি।
বার্নস

এএসপি.নেটের কোনও সূচক ছাড়াই এইরকম বেনামে অ্যারে পার্স করার কোনও উপায় আছে কি? মানগুলি [] = 1 এবং মানগুলি [] = 2 এবং মানগুলি [] = 3
চার্লস ওভেন

24

উত্তরের জন্য সবাইকে ধন্যবাদ। আর একটি দ্রুত সমাধান ব্যবহার করা হবে হ'ল JSON.param পদ্ধতিটি JSON অবজেক্টটিকে স্ট্রিংয়ে রূপান্তর করতে ট্র্যাডিশনাল প্যারামিটার সহ সত্য সেট করা আছে:

$.post("/your/url", $.param(yourJsonObject,true));

আমি aj .জ্যাক্স () এর পরিবর্তে $। পোষ্ট () ব্যবহার করছি বলে আমার জন্য ভাল এবং পুরোপুরি ফিট করে। ধন্যবাদ !
এফ্র্যাক্ট

9

অ্যারে হিসাবে ডেটা পোস্ট করবেন না। একটি তালিকাতে আবদ্ধ হতে, প্রতিটি কীটির জন্য একই মান সহ কী / মান জোড় জমা দিতে হবে।

এটি করার জন্য আপনার কোনও ফর্মের প্রয়োজন হবে না। আপনার কেবল কী / মান জোড়ার একটি তালিকা প্রয়োজন, যা আপনি $। পোস্টে কলটিতে অন্তর্ভুক্ত করতে পারেন।


3
ধন্যবাদ। আপডেট হওয়া ইউআরএল হ'ল: হ্যাকড.আরচাইভ
উইবে তিজসমা

6

ইন .NET4.5,MVC 5

javascript:

জেএস মধ্যে বস্তু: এখানে চিত্র বর্ণনা লিখুন

প্রক্রিয়া যে পোস্ট করে।

    $('.button-green-large').click(function() {
        $.ajax({
            url: 'Quote',
            type: "POST",
            dataType: "json",
            data: JSON.stringify(document.selectedProduct),
            contentType: 'application/json; charset=utf-8',
        });
    });

সি শার্প

অবজেক্টস:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List<ClaimedFee> ClaimedFees { get; set; }
}

public partial class ClaimedFee //Generated by EF6
{
    public long Id { get; set; }
    public long JourneyId { get; set; }
    public string Title { get; set; }
    public decimal Net { get; set; }
    public decimal Vat { get; set; }
    public string Type { get; set; }

    public virtual Journey Journey { get; set; }
}

নিয়ন্ত্রক:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}

উদ্দেশ্য প্রাপ্ত:

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

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


4

আর একটি বাস্তবায়ন যা কেবল স্ট্রিং নয়, অবজেক্টগুলির তালিকার সাথেও কাজ করে:

জাতীয়:

var postData = {};
postData[values] = selectedValues ;

$.ajax({
    url: "/Home/SaveList",
    type: "POST",
    data: JSON.stringify(postData),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(data){
        alert(data.Result);
    }
});

ধরে নিই যে 'নির্বাচিতভ্যালুগুলি' অবজেক্টের অ্যারে।

নিয়ামকটিতে প্যারামিটারটি সংশ্লিষ্ট ভিউমোডেলগুলির একটি তালিকা।

public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}

1

আমি যেমন এখানে আলোচনা করেছি ,

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

public string GetData() {
  // InputStream contains the JSON object you've sent
  String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

  // Deserialize it to a dictionary
  var dic =
    Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < String,
    dynamic >> (jsonString);

  string result = "";

  result += dic["firstname"] + dic["lastname"];

  // You can even cast your object to their original type because of 'dynamic' keyword
  result += ", Age: " + (int) dic["age"];

  if ((bool) dic["married"])
    result += ", Married";

  return result;
}

এই সমাধানটির আসল উপকারিতা হ'ল প্রতিটি আর্গুমেন্টের জন্য আপনাকে একটি নতুন শ্রেণির সংজ্ঞা দেওয়ার প্রয়োজন হবে না এবং তার পাশাপাশি, আপনি সহজেই আপনার বস্তুগুলিকে তাদের মূল ধরণে কাস্ট করতে পারেন।

আপনার কাজের সুবিধার্থে আপনি এই জাতীয় সাহায্যকারী পদ্ধতি ব্যবহার করতে পারেন:

public static Dictionary < string, dynamic > GetDic(HttpRequestBase request) {
  String jsonString = new StreamReader(request.InputStream).ReadToEnd();
  return Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < string, dynamic >> (jsonString);
}

0

আপনি এটি দিয়ে গ্লোবাল প্যারামিটার সেটআপ করতে পারেন

jQuery.ajaxSettings.traditional = true;

-1

উত্তরটি আমার পরিস্থিতিতে আমাকে অনেক সহায়তা করেছিল তাই তার জন্য ধন্যবাদ। তবে ভবিষ্যতের রেফারেন্সের জন্য লোকদের একটি মডেলের সাথে আবদ্ধ হওয়া উচিত এবং তারপরে যাচাই করা উচিত। ফিল হ্যাকের এই পোস্টটি এমভিসি 2 এর জন্য এটি বর্ণনা করে। http://

আশা করি এটি কাউকে সাহায্য করবে।

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