c# - एपीकंट्रोलर पैरामीटर में जटिल प्रकार शून्य हो रहा है




ajax json asp.net-web-api (5)

आप GET विधि के साथ एक जटिल वस्तु भेजने की कोशिश कर रहे हैं। यह असफल होने का कारण यह है कि GET विधि में कोई शरीर नहीं हो सकता है और सभी मान URL में एन्कोड किए जा रहे हैं। आप [FromUri] का उपयोग करके यह काम कर सकते हैं, लेकिन पहले आपको अपने क्लाइंट साइड कोड को बदलने की आवश्यकता है:

$.ajax({
    url: fullUrl,
    type: 'GET',
    dataType: 'json',
    data: { Codigo: '_1', Descricao: 'TESTE', page: 1, pageSize: 10 },
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

इस तरह से [FromUri] यूआरएल से सीधे अपनी जटिल ऑब्जेक्ट गुणों को चुनने में सक्षम होगा यदि आप अपनी एक्शन विधि बदलते हैं:

public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize)

आपका पिछला दृष्टिकोण POST विधि के साथ काम करेगा जिसमें शरीर हो सकता है (लेकिन आपको अभी भी JSON.stringify() को JSON के रूप में स्वरूपित करने के लिए उपयोग करना होगा)।

मुझे नहीं पता कि मेरा पैरामीटर "पैरामैट्रोफिल्टरो फिल्ट्रो" शून्य क्यों हो रहा है, अन्य पैरामीटर "पेज" और "पेज साइज" ठीक हो रहा है।

public class ParametroFiltro
{
    public string Codigo { get; set; }
    public string Descricao { get; set; }
}

मेरा एपीकंट्रोलर विधि प्राप्त करें:

public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize)

मेरा अजैक्स कॉल:

var fullUrl = "/api/" + self.Api;
$.ajax({
    url: fullUrl,
    type: 'GET',
    dataType: 'json',
    data: { Filtro: { Codigo: '_1', Descricao: 'TESTE' }, page: 1, pageSize: 10 },
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

सामग्री प्रदान करें जब आप AJAX कॉल करते हैं तो संपत्ति contentType करें। पोस्ट करने के लिए JSON डेटा बनाने के लिए JSON.stringify विधि का उपयोग करें। टाइप को POST और MVC मॉडल बाध्यकारी में पोस्ट करें डेटा को आपके क्लास ऑब्जेक्ट में बाध्य करेगा।

var filter = { "Filtro": { "Codigo": "_1", "Descricao": "TESTE" }, 
                                               "page": "1", "pageSize": "10" }; 
$.ajax({
    url: fullUrl,
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify(filter),
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

Newtonsoft.Json.Linq JObject के माध्यम से POST चर का उपयोग करना भी संभव है।

उदाहरण के लिए, यह पोस्ट:

$.ajax({
    type: 'POST',
    url: 'URL',
    data: { 'Note': note, 'Story': story },
    dataType: 'text',
    success: function (data) { }
});

एक एपीकंट्रोलर में इस तरह से पहुंचा जा सकता है:

public void Update([FromBody]JObject data)
{
    var Note = (String)data["Note"];
    var Story = (String)data["Story"];
}

यदि आप क्वेरी स्ट्रिंग के लिए जेसन डेटा जोड़ते हैं, और इसे बाद में वेब एपीआई पक्ष में पार्स करें। आप जटिल वस्तु को भी पार्स कर सकते हैं। यह कुछ विशेष httpget आवश्यकता मामले में जेसन ऑब्जेक्ट, espeicaly पोस्ट करने के बजाय उपयोगी है।

//javascript file 
    var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
    var request = JSON.stringify(data);
    request = encodeURIComponent(request);

    doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) {
        window.console.log(result);
    });

    //webapi file:
    [HttpGet]
    public ResponseResult StartProcess()
    {
        dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
            int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
        Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
        int userID = int.Parse(queryJson.UserID.Value);
        string userName = queryJson.UserName.Value;
    }

    //utility function:
    public static dynamic ParseHttpGetJson(string query)
    {
        if (!string.IsNullOrEmpty(query))
        {
            try
            {
                var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
                json = System.Web.HttpUtility.UrlDecode(json);
                dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);

                return queryJson;
            }
            catch (System.Exception e)
            {
                throw new ApplicationException("can't deserialize object as wrong string content!", e);
            }
        }
        else
        {
            return null;
        }
    }

निम्नलिखित को धयान मे रखते हुए:

static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());

आप सहमत हैं कि मुझे उम्मीद है कि अंतिम दो पंक्तियाँ बिल्कुल एक ही काम करना चाहिए, है ना? जिसे NM3 प्रिंट करना है।

अब, अभिव्यक्ति ट्री लाइब्रेरी कॉल क्या आप यह सुनिश्चित करने के लिए अभिव्यक्ति ट्री रूपांतरण पसंद करेंगे? कोई नहीं है! इसलिए हमें निम्नलिखित विकल्पों का सामना करना पड़ रहा है:

  1. अभिव्यक्ति ट्री लाइब्रेरी में सुविधा लागू करें। नाम तर्कों के निष्पादन के क्रम को बनाए रखने वाले अभिव्यक्ति ट्री लोअरिंग इंजन में परिवर्तन जोड़ें। Compile विधि में कोड लागू Compile जो निष्पादन आदेश को ध्यान में रखता है।
  2. x = ()=>Q(n : N(), m: M()); वास्तव में x = ()=>Q(M(), N()); रूप में कार्यान्वित किया जाता है x = ()=>Q(M(), N()); और गैर-अभिव्यक्ति-वृक्ष संस्करण के साथ असंगत हो।
  3. अभिव्यक्ति पेड़ों में नामांकित तर्क को अस्वीकार करें। उस प्रभाव के लिए एक त्रुटि संदेश लागू करें।

(1) अच्छा है, लेकिन महंगा है। (2) एक गैर-स्टार्टर है; हम अच्छे विवेक में इस तरह के "गेटा" का परिचय नहीं दे सकते। (3) सस्ता है, लेकिन परेशान है।

हमने (3) को चुना।





c# ajax json asp.net-web-api