দৃ strongly়ভাবে টাইপ করা এমভিসি 3 ভিউ থেকে মডেল পাস করার জন্য জেউকোরিতে এজেএক্স পোস্ট ব্যবহারের সঠিক উপায়


100

আমি একজন শিক্ষানবিশ ওয়েব প্রোগ্রামার তাই আমার কিছু "জার্গন" সঠিক না হলে দয়া করে আমাকে ক্ষমা করুন। আমি এমভিসি 3 ফ্রেমওয়ার্ক ব্যবহার করে এএসপি.এনইটি ব্যবহার করে একটি প্রকল্প পেয়েছি।

আমি এমন অ্যাডমিন ভিউতে কাজ করছি যেখানে অ্যাডমিন সরঞ্জামগুলির একটি তালিকা সংশোধন করবে। ফাংশনগুলির মধ্যে একটি হ'ল "আপডেট" বোতাম যা আমি এমভিসি নিয়ামককে একটি পোস্ট প্রেরণের পরে ওয়েবপৃষ্ঠায় গতিশীলভাবে এন্ট্রি সম্পাদনা করতে jquery ব্যবহার করতে চাই।

আমি ধারণা করি যে কোনও একক প্রশাসক সেটিংয়ে এই পদ্ধতিটি "নিরাপদ" যেখানে ওয়েবপেজটি ডেটাবেসের সাথে সিঙ্ক থেকে বেরিয়ে আসার ন্যূনতম উদ্বেগ রয়েছে।

আমি এমন একটি ভিউ তৈরি করেছি যা দৃ strongly়ভাবে টাইপ করা হয়েছে এবং আশা করেছিলাম একটি এজেএক্স পোস্ট ব্যবহার করে মডেল ডেটা এমভিসি নিয়ন্ত্রণে পৌঁছে দেবে।

নিম্নলিখিত পোস্টে, আমি এমন কিছু পেয়েছি যা আমি যা দেখছি তার অনুরূপ: জিকুয়েরি আজাক্স এবং এএসপি.নেট এমভিসি 3 নাল প্যারামিটারগুলির কারণ

আমি উপরের পোস্ট থেকে কোড নমুনা ব্যবহার করব।

মডেল:

public class AddressInfo 
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }
}

নিয়ন্ত্রক:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Check(AddressInfo addressInfo)
    {
        return Json(new { success = true });
    }
}

দেখুন স্ক্রিপ্ট:

<script type="text/javascript">
var ai = {
    Address1: "423 Judy Road",
    Address2: "1001",
    City: "New York",
    State: "NY",
    ZipCode: "10301",
    Country: "USA"
};

$.ajax({
    url: '/home/check',
    type: 'POST',
    data: JSON.stringify(ai),
    contentType: 'application/json; charset=utf-8',
    success: function (data.success) {
        alert(data);
    },
    error: function () {
        alert("error");
    }
});
</script>

উপরেরটি এখনও ব্যবহার করার সুযোগ পাইনি। তবে আমি ভাবছিলাম যে মডেল ডেটাটি অ্যাজ্যাক্স ব্যবহার করে এমভিসি নিয়ন্ত্রণে ফিরে যাওয়ার জন্য এটি "সেরা" পদ্ধতি ছিল?

মডেল তথ্য প্রকাশের বিষয়ে কি আমাকে উদ্বিগ্ন হওয়া উচিত?

উত্তর:


72

আপনি var ঘোষণা এবং স্ট্রিংফাইটি এড়িয়ে যেতে পারেন sk অন্যথায়, এটি ঠিক কাজ করবে।

$.ajax({
    url: '/home/check',
    type: 'POST',
    data: {
        Address1: "423 Judy Road",
        Address2: "1001",
        City: "New York",
        State: "NY",
        ZipCode: "10301",
        Country: "USA"
    },
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.success);
    },
    error: function () {
        alert("error");
    }
});

সামান্য সমন্বয় নির্দেশ করার জন্য ধন্যবাদ। সুরক্ষা দৃষ্টিকোণ থেকে মডেল কাঠামোটি উন্মোচিত করার বিষয়ে কি কোনও উদ্বেগ রয়েছে?
জন স্টোন

আমার কাছে সুরক্ষার সমস্যা হিসাবে উদ্বেগজনক কিছু নেই। যদিও আপনি যদি সত্যিই এটি সম্পর্কে উদ্বিগ্ন হন তবে আপনি সর্বদা এমভিসি সাইডে একটি কাস্টম মডেল বাইন্ডার তৈরি করতে পারেন।
ক্রেগ এম

8
এটি আমার পক্ষে ব্যর্থ হয়েছিল। এমভিসি 5 তে কাজ করার জন্য আমাকে কল করতে JSON.stringify ({...}) ব্যবহার করতে হয়েছিল।
জনচেল

আমি লক্ষ্য করেছি যে এপিআই নিয়ন্ত্রণকারীদের সাথে কাজ করার সময় আমাকেও একই কাজ করতে হবে। এই উত্তরটি 4 বছর আগে লেখা হয়েছিল যদিও এর আগে এপিআই নিয়ন্ত্রণকারীদের অস্তিত্ব ছিল।
ক্রেগ এম

1
godশ্বর, আমার কাছে কনটেন্ট টাইপের পরিবর্তে ডেটা টাইপ ছিল, সে সবসময় আমাকে পায়!
ফিল

175

আমি এটি প্রয়োগের জন্য 3 টি উপায় পেয়েছি:

সি # শ্রেণি:

public class AddressInfo {
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }
}

কর্ম:

[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
    return Json(new { success = true });
}

জাভাস্ক্রিপ্ট আপনি এটি তিনটি উপায়ে করতে পারেন:

1) ক্যারি স্ট্রিং:

$.ajax({
    url: '/en/Home/Check',
    data: $('#form').serialize(),
    type: 'POST',
});

এখানে ডেটা একটি স্ট্রিং।

"Address1=blah&Address2=blah&City=blah&State=blah&ZipCode=blah&Country=blah"

2) অবজেক্ট অ্যারে:

$.ajax({
    url: '/en/Home/Check',
    data: $('#form').serializeArray(),
    type: 'POST',
});

এখানে ডেটা কী / মান জোড়ার একটি অ্যারে রয়েছে:

=[{name: 'Address1', value: 'blah'}, {name: 'Address2', value: 'blah'}, {name: 'City', value: 'blah'}, {name: 'State', value: 'blah'}, {name: 'ZipCode', value: 'blah'}, {name: 'Country', value: 'blah'}]

3) জেএসএন:

$.ajax({
      url: '/en/Home/Check',
      data: JSON.stringify({ addressInfo:{//missing brackets
          Address1: $('#address1').val(),
          Address2: $('#address2').val(),
          City: $('#City').val(),
          State: $('#State').val(),
          ZipCode: $('#ZipCode').val()}}),
      type: 'POST',
      contentType: 'application/json; charset=utf-8'
});

এখানে ডেটাটি সিরিয়ালযুক্ত জেএসএন স্ট্রিং। নোটটি সার্ভারে প্যারামিটারের সাথে মিলতে হবে তা নোট করুন !!

='{"addressInfo":{"Address1":"blah","Address2":"blah","City":"blah","State":"blah", "ZipCode", "blah", "Country", "blah"}}'

1
সবেমাত্র এই দুর্দান্ত, পুরো উত্তরটি এসেছে যা আমার কাছে এখনও জানেনি didn't +1, ধন্যবাদ!
শানকিলেন

# 2 যা আমি খুঁজছিলাম। এই উত্তর হওয়া উচিত।
TheGeekZn

সম্পাদনা: data: $('input, textarea, select').serialize(),আমার কাজ করার জন্য ব্যবহার করতে হয়েছিল।
TheGeekZn

আরে জাজারে !! তৃতীয় পদ্ধতির সাথে মডেলটিতে তারিখটি কীভাবে পাস করবেন ??
গুরুপ্রসাদ রাও

1
বিলম্বের জন্য দুঃখিত @ গুরুপ্রসাদআরও একটি তারিখ পাস করার জন্য আপনার জাভাস্ক্রিপ্ট কোডের স্ট্রিং হতে পারে তারিখ এবং সময় থাকতে পারে এবং এমভিসি এটি ডেটটাইম অবজেক্টে অনুবাদ করবে।
জাজারেতে

12

এটি আমার পক্ষে এভাবে কাজ করেছে:

$.post("/Controller/Action", $("#form").serialize(), function(json) {       
        // handle response
}, "json");

[HttpPost]
public ActionResult TV(MyModel id)
{
    return Json(new { success = true });
}

8

আপনার যা আছে তা ঠিক আছে - তবে কিছু টাইপিং সংরক্ষণ করতে আপনি কেবল নিজের ডেটা ব্যবহার করতে পারেন

ডেটা: $ ('# ফর্ম আইডি') serial

দেখতে http://www.ryancoughlin.com/2009/05/04/how-to-use-jquery-to-serialize-ajax-forms/ বিবরণের জন্য, সিনট্যাক্স প্রশংসনীয় মৌলিক।


সিরিয়ালাইজ ফাংশনটি ব্যবহার করার জন্য, আমার বোধগম্যতা হল শ্রেণীর প্রতিটি সদস্যকে একটি ফর্ম অবজেক্টে ব্যবহার করা দরকার। যদি এটি সঠিক হয় তবে আমি এসএল হতে পারি।
জন স্টোন

1
আহা হ্যাঁ .. যদি আপনি সিরিয়ালাইজ ব্যবহার না করতে পারেন। আপনি সর্বদা যদিও ডিওএম চালিত করতে পারেন এবং সেই উপাদানগুলির সাথে একটি ফর্ম তৈরি করতে পারেন এবং এটির সিরিয়ালাইজ করতে পারেন - তবে ... সম্ভবত ক্ষেত্রগুলি ম্যানুয়ালি টাইপ করা আরও পরিষ্কার হবে।
অ্যাডাম টিউলিপার - এমএসএফটি

@ টাহারহেনসিদ্দিকী সিরিয়ালাইজ আসলে আইই তে কাজ করে, কী কাজ করে না? আপনি যদি কোনো ত্রুটি পেতে পারি?
অ্যাডাম টিউলিপার - এমএসএফটি

আমার মডেলের প্রতিটি সম্পত্তি শূন্য হয়ে আসছে
তাহা রেহমান সিদ্দিকী

@ তাহারহমানসিদ্দিকী আপনার ফর্ম ক্ষেত্রগুলির 'নাম' আপনার মডেল বৈশিষ্ট্যের নামের সাথে মেলে?
মঙ্গুজএনএক্স

0

এমভিসি 5 ব্যবহার করলে এই সমাধানটি পড়ুন!

আমি জানি যে প্রশ্নটি বিশেষত এমভিসি 3 এর জন্য ডাকা হয়েছিল, তবে আমি এমভিসি 5 এর সাথে এই পৃষ্ঠাতে হোঁচট খেয়েছি এবং আমার পরিস্থিতিতে অন্য কারও জন্য সমাধান পোস্ট করতে চেয়েছিলাম। আমি উপরের সমাধানগুলি চেষ্টা করেছিলাম, কিন্তু তারা আমার পক্ষে কাজ করেনি, অ্যাকশন ফিল্টারটি কখনও পৌঁছায়নি এবং কেন তা বুঝতে পারি না। আমি আমার প্রকল্পে 5 সংস্করণ ব্যবহার করছি এবং নিম্নলিখিত ক্রিয়া ফিল্টারটি দিয়ে শেষ করব:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Filters;

namespace SydHeller.Filters
{
    public class ValidateJSONAntiForgeryHeader : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            string clientToken = filterContext.RequestContext.HttpContext.Request.Headers.Get(KEY_NAME);
            if (clientToken == null)
            {
                throw new HttpAntiForgeryException(string.Format("Header does not contain {0}", KEY_NAME));
            }

            string serverToken = filterContext.HttpContext.Request.Cookies.Get(KEY_NAME).Value;
            if (serverToken == null)
            {
                throw new HttpAntiForgeryException(string.Format("Cookies does not contain {0}", KEY_NAME));
            }

            System.Web.Helpers.AntiForgery.Validate(serverToken, clientToken);
        }

        private const string KEY_NAME = "__RequestVerificationToken";
    }
}

- গ্রন্থাগারগুলি নয় using System.Web.Mvcএবং নোট করুন (আমার মনে হয় এটি এমভিসি ভি 5 এর মাধ্যমে পরিবর্তিত জিনিসগুলির মধ্যে একটি isusing System.Web.Mvc.Filtershttp

তারপরে [ValidateJSONAntiForgeryHeader]আপনার কর্মে (বা নিয়ামক) কেবলমাত্র ফিল্টারটি প্রয়োগ করুন এবং এটি সঠিকভাবে বলা উচিত।

আমার লেআউট পৃষ্ঠায় ঠিক </body>আছে@AntiForgery.GetHtml();

পরিশেষে, আমার রেজার পৃষ্ঠায়, আমি এজ্যাক্স কলটি নিম্নলিখিতভাবে করছি:

var formForgeryToken = $('input[name="__RequestVerificationToken"]').val();

$.ajax({
  type: "POST",
  url: serviceURL,
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  data: requestData,
  headers: {
     "__RequestVerificationToken": formForgeryToken
  },
     success: crimeDataSuccessFunc,
     error: crimeDataErrorFunc
});

1
আপনি কি ম্যানুয়ালি আপনার সমস্ত ফর্ম মান পুনরুদ্ধার করছেন? কেন হবে না data: $("#the-form").serialize()?
সিনজাই

1
@ সিনজাই আমাকে আবার আমার কোডটি দেখতে হবে তবে আমি বিশ্বাস করি যে আমি সেখানে আরও কিছু প্রক্রিয়াজাতকরণ করছি। ".সিরিয়ালাইজ ()" এছাড়াও কাজ করবে যদি আপনার কেবল ইনপুট মানগুলির প্রয়োজন হয়
blubberbo

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