2012-05-31 14 views
6

के साथ एक अनुरोध से मान प्राप्त मेरे पास निम्न स्क्रिप्ट कि MVC में एक नियंत्रक के लिए डेटा भेज रहा है:सामग्री प्रकार आवेदन/json

$.ajax({ 
    url: '/products/create', 
    type: 'post', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ 
     'name':'widget', 
     'foo':'bar' 
    }) 
}); 

मेरे नियंत्रक इस तरह दिखता है:

[HttpPost] 
public ActionResult Create(Product product) 
{ 
    return Json(new {success = true}); 
} 

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

क्या कोई तरीका है कि मैं

  • मॉडल
  • को संशोधित करने के बिना अपने नियंत्रक कार्रवाई में "foo" चर प्राप्त कर सकता हूं
  • कार्रवाई के हस्ताक्षर को संशोधित करने

यदि यह एक नियमित रूप प्रस्तुत किया गया था, मैं Request.Form [ "foo"] के लिए उपयोग किया जाएगा, लेकिन बाद से यह आवेदन/json के माध्यम से प्रस्तुत की गई थी यह मान रिक्त है ।

मैं इस मान को एक्शन फ़िल्टर से एक्सेस करने में सक्षम होना चाहता हूं और इसलिए मैं हस्ताक्षर/मॉडल को संशोधित नहीं करना चाहता हूं।

filterContext.HttpContext.Current.Request.Params 

इन संग्रह में एक नज़र अगर आप अपने पैरामीटर देखें:

उत्तर

-2

यहां तक ​​कि अगर यह 'foo' आबद्ध नहीं है, इसके माध्यम से आप कार्रवाई फिल्टर में उपलब्ध हो जाएगा।

तो हाँ बस अपना एक्शन फ़िल्टर बनाएं और हस्ताक्षर को न बदलें जो यह काम करेगा।

बस अपने फ़िल्टर को डीबग करने के मामले में यह सुनिश्चित करने के लिए कि मूल्य कहां होगा।

अन्त में आप अपने Global.asax में पंजीकृत json के लिए अपने मूल्यों प्रदाता की आवश्यकता है:

$.ajax({ 
    url: '/products/create', 
    type: 'post', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ 
     name:'widget', 
     foo:'bar' 
    }) 
}); 
उद्धरण के बिना

:

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 
} 

आप पैरामीटर गलत रूप में अच्छी तरह है इसे और अधिक की तरह होने की जरूरत है ।

संपादित करें (और अधिक सटीक होना करने के लिए):

अपने फिल्टर इच्छा इन विधि

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 

} 
public void OnActionExecuted(ActionExecutedContext filterContext) 
{ 

} 
+0

, सभी विधि पैरामीटर "filterContext" – Kuqd

+0

सार्वजनिक शून्य OnActionExecuting (ActionExecutingContext filterContext) { } – Kuqd

+0

मेरे संपादन को देखने की है। धन्यवाद – Kuqd

1

मैं एक कार्रवाई फ़िल्टर से इस मूल्य का उपयोग कर सकेंगे करना चाहते हैं और उस है मैं हस्ताक्षर/मॉडल को संशोधित नहीं करना चाहता हूं।

एक्शन फ़िल्टर से मूल्य तक पहुंचने से विधि के हस्ताक्षर को बदले बिना मुश्किल हो जाएगी। कारण post से बेहतर समझ जाएगा।

यह कोड किसी प्राधिकरण फ़िल्टर या कहीं भी कोड को बाध्यकारी से पहले चलाएगा कोड में काम करेगा।

public class CustomFilter : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var request = filterContext.RequestContext.HttpContext.Request; 

     var body = request.InputStream; 
     var encoding = request.ContentEncoding; 
     var reader = new StreamReader(body, encoding); 
     var json = reader.ReadToEnd(); 

     var ser = new JavaScriptSerializer(); 

     // you can read the json data from here 
     var jsonDictionary = ser.Deserialize<Dictionary<string, string>>(json); 

     // i'm resetting the position back to 0, else the value of product in the action 
     // method will be null. 
     request.InputStream.Position = 0; 
    } 
    } 
4

मैं आज लगभग वही करना चाहता था और इस सवाल को बिना किसी जवाब के मिला।मैंने मार्क के समान समाधान के साथ इसे हल किया।

यह एएसपीनेट एमवीसी 4 में मेरे लिए बहुत अच्छा काम करता है। शायद किसी और को यह प्रश्न पढ़ने में मदद कर सकता है भले ही यह पुराना हो।

 [HttpPost] 
     public ActionResult Create() 
     { 
      string jsonPostData; 
      using (var stream = Request.InputStream) 
      { 
       stream.Position = 0; 
       using (var reader = new System.IO.StreamReader(stream)) 
       { 
        jsonPostData = reader.ReadToEnd(); 
       } 
      } 
      var foo = Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonPostData)["foo"]; 

      return Json(new { success = true }); 
     } 

महत्वपूर्ण हिस्सा धारा की स्थिति को रीसेट करना था क्योंकि यह पहले से ही कुछ एमवीसी आंतरिक कोड या जो कुछ भी पढ़ा गया है।

ActionFilter में
+0

जबकि यह काम करता है, मुझे जिस समस्या का सामना करना पड़ा वह था, मैंने स्ट्रीम को पढ़ा था अब प्राधिकृत करें, स्ट्रीम को खाली कर दिया गया था ताकि नियंत्रक अनुरोध निकाय प्राप्त हुआ इसमें कुछ भी नहीं था। – PUG

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