2016-05-02 16 views
6

पर प्रति नियंत्रक विशिष्ट JSON सेटिंग्स मुझे अपने एएसपी.नेट एमवीसी 6 वेबएपीआई में प्रति नियंत्रक विशिष्ट JSON सेटिंग्स की आवश्यकता है। Force CamelCase on ASP.NET WebAPI Per Controllerएएसपी.नेट एमवीसी 6

using System; 
using System.Linq; 
using System.Web.Http.Controllers; 
using System.Net.Http.Formatting; 
using Newtonsoft.Json.Serialization; 

public class CamelCaseControllerConfigAttribute : Attribute, IControllerConfiguration 
{ 
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) 
{ 
    var formatter = controllerSettings.Formatters.OfType<JsonMediaTypeFormatter>().Single(); 
    controllerSettings.Formatters.Remove(formatter); 

    formatter = new JsonMediaTypeFormatter 
    { 
    SerializerSettings = {ContractResolver = new CamelCasePropertyNamesContractResolver()} 
    }; 

    controllerSettings.Formatters.Add(formatter); 

} 
} 
+0

आप अपने एपीआई (एस) को अपने मॉडल कक्षाओं के समान नाम से प्राप्त नहीं करना चाहते हैं? इसके बजाय, आप उन्हें प्रत्येक मॉडल के लिए पासलकेज़ में चाहते हैं? –

+0

यह 'JsonSerializerSettings' ऑब्जेक्ट तक पहुंचने के लिए सिर्फ एक नमूना है। मेरे मामले में, मुझे मोबाइल एप्लिकेशन – Karine

उत्तर

3

इस वर्ग के ठीक काम करता है:

using System; 
using System.Linq; 
using Newtonsoft.Json.Serialization; 
using Microsoft.AspNet.Mvc.Filters; 
using Newtonsoft.Json; 
using Microsoft.AspNet.Mvc.Formatters; 

namespace Teedl.Web.Infrastructure 
{ 
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 

    public class MobileControllerConfiguratorAttribute : Attribute, IResourceFilter 
    { 
     private readonly JsonSerializerSettings serializerSettings; 

     public MobileControllerConfiguratorAttribute() 
     { 
      serializerSettings = new JsonSerializerSettings() 
      { 
       ContractResolver = new CamelCasePropertyNamesContractResolver(), 
       TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects, 
       TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, 
       Binder = new TypeNameSerializationBinder("Teedl.Model.Mobile.{0}, Teedl.Model.ClientMobile") 
     }; 
     } 


     public void OnResourceExecuted(ResourceExecutedContext context) 
     { 
     } 

     public void OnResourceExecuting(ResourceExecutingContext context) 
     { 
      var mobileInputFormatter = new JsonInputFormatter(serializerSettings); 
      var inputFormatter = context.InputFormatters.FirstOrDefault(frmtr => frmtr is JsonInputFormatter); 
      if (inputFormatter != null) 
      { 
       context.InputFormatters.Remove(inputFormatter); 
      } 
      context.InputFormatters.Add(mobileInputFormatter); 

      var mobileOutputFormatter = new JsonOutputFormatter(serializerSettings); 
      var outputFormatter = context.OutputFormatters.FirstOrDefault(frmtr => frmtr is JsonOutputFormatter); 
      if (outputFormatter != null) 
      { 
       context.OutputFormatters.Remove(outputFormatter); 
      } 
      context.OutputFormatters.Add(mobileOutputFormatter); 
     } 
    } 
} 

उपयोग:

[Route("api/mobile/businessrequest")] 
[Authorize] 
[MobileControllerConfigurator] 
public class MobileBusinessRequestController : BaseController 
{ 
+4

द्वारा उपयोग किए गए कुछ नियंत्रक के लिए बाइंडर बदलने की आवश्यकता है इनपुट/आउटपुटफॉर्मेटर्स संसाधन संदर्भ पर अब मौजूद नहीं हैं। क्या किसी को पता है कि अब उन्हें कैसे पहुंचाया जा सकता है? –

+1

"Microsoft.AspNetCore.Mvc.Filters" के लिए भी समाधान चाहते हैं। – HappyLiang

+0

शायद विभिन्न ढांचे संस्करणों के लिए आप https://stackoverflow.com/a/44499722/782022 – aeroson

3

आप एक का उपयोग कर सकते मैं इस नमूने कि काम करता है (! मुझे आशा है कि) MVC 5 के लिए मिला अपने नियंत्रक कार्रवाई विधियों पर JsonResult का वापसी प्रकार। मेरे मामले में, मुझे कुछ विरासत परिदृश्यों के लिए पास्कल केस वापस करने के लिए विशिष्ट कार्रवाइयों की आवश्यकता थी। JsonResult ऑब्जेक्ट आपको JsonSerializerSettings के रूप में एक वैकल्पिक पैरामीटर पारित करने की अनुमति देता है।

public JsonResult Get(string id) 
    { 
      var data = _service.getData(id); 

     return Json(data, new JsonSerializerSettings 
      { 
       ContractResolver = new DefaultContractResolver() 
      }); 

    } 

अधिक सुसंगत नियंत्रक विधि हस्ताक्षर करवाने के लिए मैं एक विस्तार विधि बना दी:

public static JsonResult ToPascalCase(this Controller controller, object model) 
     { 
      return controller.Json(model, new JsonSerializerSettings 
      { 
       ContractResolver = new DefaultContractResolver() 
      }); 
     } 

अब मैं बस विस्तार विधि मेरी नियंत्रक के अंदर नीचे की तरह कॉल कर सकते हैं:

public IActionResult Get(string id) 
     { 
      var data = _service.getData(id); 
      return this.ToPascalCase(data); 
     } 
+0

यूप का उपयोग कर सकते हैं जो मैं भी कर रहा हूं - इसी तरह की परिदृश्य: विरासत पुस्तकालय जिसमें जेएस निर्भरताएं हैं जो पुराने कोड के साथ बनाई गई थीं डिफ़ॉल्ट मामला ऐप सेटिंग्स को नियंत्रित नहीं कर सकता क्लाइंट सही मामला पाता है। इच्छा है कि सरल अनुबंध इंटरफेस को सुरक्षित रखने के लिए ऐसा करने का एक अलग तरीका था। –

+0

@RickStrahl संपादित करने के लिए एक विस्तार विधि शामिल करने के लिए संपादित उत्तर। थोड़ा क्लीनर –

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