2016-02-04 6 views
6

पर NullValueHandling सेट करें पल भाग के लिए, मैं अपने एपीआई प्रतिक्रिया से शून्य मानों को बाहर करना चाहता हूं, इसलिए मेरी startup.cs फ़ाइल में, मेरे पास यह है।एक नियंत्रक स्तर

services.AddMvc() 
    .AddJsonOptions(options => 
    { 
     // Setup json serializer 
     options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
    }); 

लेकिन क्या यह कहना संभव है कि 1 या अधिक नियंत्रकों पर, मैं वास्तव में नल मूल्यों को शामिल करना चाहता हूं ??

उत्तर

0

एक विकल्प कस्टम जेसन परिणाम प्रकार बनाना है, जैसा कि इस प्रश्न में वर्णित है: Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?। तो फिर तुम आधार नियंत्रक पर bool वर है और यह अक्षम अशक्त का उपयोग करते समय कस्टम Json परिणाम कर सकते हैं या यहां तक ​​कि विकल्प सीधे पारित उपयोग कर सकते हैं:

return Json(data, ignoreNulls: true); 
0

आप अपने नियंत्रक के कोड के अंदर BindingContext.OutputFormatters से JsonOutputFormatter मिल सकती है। यह आपको गतिशील रूप सेSerializerSettings बदलने देता है।

नियंत्रक कोड में using Newtonsoft.Json; शामिल करने के लिए और अपने नियंत्रक कार्रवाई के अंदर निम्न कार्य करने का प्रयास करें:

var f = BindingContext.OutputFormatters.FirstOrDefault(
      formatter => formatter.GetType() == 
         typeof (Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter)) 
     as Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter; 
if (f != null) { 
    //f.SerializerSettings.Formatting = Formatting.Indented; 
    f.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
} 

मैं Formatting = Formatting.Indented शामिल बस केवल अपने परीक्षण के लिए, क्योंकि एक परिणाम तुरंत देखते हैं। आपको इसके कारण की आवश्यकता नहीं है।

अद्यतन: मैंने एमवीसी वेब एप्लिकेशन का उपयोग करके कोई प्रमाणीकरण के साथ डेमो प्रोजेक्ट बनाया है। तब मैं HomeController में जोड़ा metod

public object TestMethod() 
{ 
    var testResult = new { 
         name = "Test", 
         value = 123, 
         nullableProperty = (string) null 
        }; 

    return testResult; 
} 

निम्नलिखित और Home/TestMethod को परियोजना के लॉन्च URL बदल गया है और डेमो शुरू कर दिया। मैं देख सकता

{"name":"Test","value":123,"nullableProperty":null} 

आप बयानों का उपयोग कर कोड जो मैं शुरू में तैनात (एक मानक using Microsoft.AspNet.Mvc; और using System.Linq; है की जरूरत है) का उपयोग करने के लिए कोई अतिरिक्त जोड़ने की जरूरत नहीं है, लेकिन कोड यदि आप और अधिक पठनीय हो सकता है using Microsoft.AspNet.Mvc.Formatters; और using Newtonsoft.Json; होगा। मैं Microsoft.AspNet.Mvc.Formatters और Newtonsoft.Json के लिए बयानों का उपयोग कर जोड़ा गया है और निम्नलिखित के लिए कोड को संशोधित

public object TestMethod() 
{ 
    var testResult = new { 
         name = "Test", 
         value = 123, 
         nullableProperty = (string) null 
        }; 

    var f = BindingContext.OutputFormatters.FirstOrDefault(
       formatter => formatter.GetType() == typeof (JsonOutputFormatter)) as JsonOutputFormatter; 
    if (f != null) { 
     f.SerializerSettings.Formatting = Formatting.Indented; 
     f.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
    } 
    return testResult; 
} 

उत्पादन परिणामों संस्करण 6.0.6 में

{ 
    "name": "Test", 
    "value": 123 
} 

मानक कोड उपयोग "Newtonsoft.Json" निम्नलिखित के रूप में अब लग रहा है। हम Newtonsoft.Json के नवीनतम संस्करण का उपयोग करने के लिए निर्भरताओं में "Newtonsoft.Json": "8.0.2" जोड़ सकते हैं। अप्रत्यक्ष निर्भरताओं को हल करने में समस्या देखें जो मैंने the issue में रिपोर्ट की थी और जो अभी भी खोला गया है।

आप here से परीक्षण प्रोजेक्ट डाउनलोड कर सकते हैं।

+1

मुझे अपने नियंत्रक विधि के भीतर से BindingContext दिखाई नहीं दे रहा है? यह एएसपीएनईटी 5 के लिए है? – Gillardo

+0

@ उपयोगकर्ता 2736022: कारण का हां। प्रत्येक नियंत्रक कार्रवाई के अंदर आपके पास '' गुण 'HttpContext', 'BindingContext' और इसी तरह के साथ हैं। आप बस अपनी विधि के अंदर 'यह' टाइप कर सकते हैं। 'टाइप' टाइप करने के बाद इंटेलिजेंस आपको 'बाइंडिंग कॉन्टेक्स्ट' सहित 'इस' के सभी गुण दिखाएगा। सी # आपको इस 'बाइंडिंग कॉन्टेक्स्ट' के बजाय 'बाइंडिंग कॉन्टेक्स्ट' लिखने की अनुमति देता है (अनुशंसा करता है)। – Oleg

+0

क्या आप नामस्थान के साथ जांच सकते हैं?यह कहता है कि इसके नियंत्रक में बाइंडिंग कॉन्टेक्स्ट – Gillardo

संबंधित मुद्दे