2008-11-26 7 views
88

मेरा वर्तमान कोड निम्न जैसा दिखता है। मैं अपने सरणी को नियंत्रक को कैसे पास कर सकता हूं और मेरे नियंत्रक कार्रवाई को किस तरह के पैरामीटर स्वीकार करना चाहिए?जेएसओएन, jQuery से एएसपी.नेट एमवीसी नियंत्रक के साथ जटिल वस्तुओं की एक सरणी कैसे पोस्ट करें?

function getplaceholders() { 
    var placeholders = $('.ui-sortable'); 
    var result = new Array(); 
    placeholders.each(function() { 
     var ph = $(this).attr('id'); 
     var sections = $(this).find('.sort'); 
     var section; 

     sections.each(function(i, item) { 
      var sid = $(item).attr('id'); 

      result.push({ 'SectionId': sid, 'Placeholder': ph, 'Position': i }); 
     }); 
    }); 
    alert(result.toString()); 
    $.post(
     '/portal/Designer.mvc/SaveOrUpdate', 
     result, 
     function(data) { 
      alert(data.Result); 
     }, "json"); 
}; 

मेरे नियंत्रक कार्रवाई विधि की तरह

public JsonResult SaveOrUpdate(IList<PageDesignWidget> widgets) 

उत्तर

83

मैं एक समाधान मिल गया है लिखा था। मैं का एक समाधान का उपयोग । स्टीव गैर-यहूदी, jQuery and ASP.NET MVC – sending JSON to an Action – Revisited

मेरे ASP.NET MVC दृश्य कोड लगता है:

function getplaceholders() { 
     var placeholders = $('.ui-sortable'); 
     var results = new Array(); 
     placeholders.each(function() { 
      var ph = $(this).attr('id'); 
      var sections = $(this).find('.sort'); 
      var section; 

      sections.each(function(i, item) { 
       var sid = $(item).attr('id'); 
       var o = { 'SectionId': sid, 'Placeholder': ph, 'Position': i }; 
       results.push(o); 
      }); 
     }); 
     var postData = { widgets: results }; 
     var widgets = results; 
     $.ajax({ 
      url: '/portal/Designer.mvc/SaveOrUpdate', 
      type: 'POST', 
      dataType: 'json', 
      data: $.toJSON(widgets), 
      contentType: 'application/json; charset=utf-8', 
      success: function(result) { 
       alert(result.Result); 
      } 
     }); 
    }; 

और मेरे नियंत्रक कार्रवाई एक कस्टम अत्री से सजाया गया है कस्टम विशेषता के लिए bute

[JsonFilter(Param = "widgets", JsonDataType = typeof(List<PageDesignWidget>))] 
public JsonResult SaveOrUpdate(List<PageDesignWidget> widgets 

कोड here पाया जा सकता है (लिंक अब टूट गया है)।

क्योंकि लिंक टूट गया है इस JsonFilterAttribute

के लिए कोड है
public class JsonFilter : ActionFilterAttribute 
{ 
    public string Param { get; set; } 
    public Type JsonDataType { get; set; } 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.ContentType.Contains("application/json")) 
     { 
      string inputContent; 
      using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream)) 
      { 
       inputContent = sr.ReadToEnd(); 
      } 
      var result = JsonConvert.DeserializeObject(inputContent, JsonDataType); 
      filterContext.ActionParameters[Param] = result; 
     } 
    } 
} 

JsonConvert.DeserializeObject Json.NET

से है

लिंक: Serializing and Deserializing JSON with Json.NET

+0

अच्छा काम यहाँ! – jeffreypriebe

+0

बहुत अच्छा लगता है - ब्लॉग पोस्ट और कस्टम विशेषता कोड लिंक अब और काम नहीं करते हैं - क्या आप दोबारा पोस्ट कर सकते हैं? – littlechris

+4

इस समाधान के लिए ग्राहक और सर्वर पक्ष में परिवर्तन की आवश्यकता है। मुझे पता है कि आपको बहुत पहले इसकी आवश्यकता थी, लेकिन मैं एक अलग दृष्टिकोण के लिए एक लिंक भी प्रदान कर सकता हूं, जो कि एक साधारण jQuery प्लगइन का उपयोग करता है जो किसी भी जावास्क्रिप्ट ऑब्जेक्ट को उस रूप में परिवर्तित करना संभव बनाता है जो डिफ़ॉल्ट मॉडल बाइंडर समझता है और मॉडल पैरामीटर को बाध्य करता है। कोई फ़िल्टर की आवश्यकता नहीं है। http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html मुझे नहीं पता कि आपने सत्यापन त्रुटियों को कैसे हल किया है, लेकिन मेरे पास इसका समाधान भी है: http://erraticdev.blogspot.com/2010/11/handling-validation-errors-on-ajax.html –

8

Create REST API using ASP.NET MVC that speaks both JSON and plain XML की दूसरी छमाही की ओर लग रहा है, उद्धृत करने के लिए:

अब हम JSON और एक्सएमएल पेलोड स्वीकार करने के लिए, के माध्यम से वितरित की जरूरत है HTTP पोस्ट कभी-कभी आपका ग्राहक बैच प्रोसेसिंग के लिए एक शॉट में ऑब्जेक्ट्स का संग्रह अपलोड करना चाहता है। इसलिए, वे जेएसओएन या एक्सएमएल प्रारूप का उपयोग कर ऑब्जेक्ट्स अपलोड कर सकते हैं। एएसपी.नेट एमवीसी में स्वचालित रूप से पोस्ट JSON या XML को पार्स करने के लिए कोई मूल समर्थन नहीं है और स्वचालित रूप से एक्शन पैरामीटर पर मैप करें। तो, मैं। एक फिल्टर है कि यह करता है। "

इसके बाद वे एक कार्रवाई फिल्टर दिखाए गए कोड के साथ सी # वस्तुओं के लिए JSON नक्शे को लागू करने वाली

+0

मैं सिर्फ अपने anwser लिख रहा था। लेकिन मैं इसे वैसे भी पोस्ट करूंगा ;-) – JSC

+0

याहू, स्टीव जेनेटाइल की तरह दिखता है ओमर की पोस्ट भी पढ़ें! – anonymous

+0

हाँ मैंने ओमर की पोस्ट भी पढ़ी है – JSC

7

पहले डाउनलोड इस जावा स्क्रिप्ट कोड, JSON2.js, इससे हमें ऑब्जेक्ट को स्ट्रिंग में क्रमबद्ध करने में मदद मिलेगी।

मेरे उदाहरण में मैं एक jqGrid की पंक्तियों पोस्टिंग कर रहा हूँ अजाक्स के माध्यम से:

var commissions = new Array(); 
    // Do several row data and do some push. In this example is just one push. 
    var rowData = $(GRID_AGENTS).getRowData(ids[i]); 
    commissions.push(rowData); 
    $.ajax({ 
     type: "POST", 
     traditional: true, 
     url: '<%= Url.Content("~/") %>' + AREA + CONTROLLER + 'SubmitCommissions', 
     async: true, 
     data: JSON.stringify(commissions), 
     dataType: "json", 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      if (data.Result) { 
       jQuery(GRID_AGENTS).trigger('reloadGrid'); 
      } 
      else { 
       jAlert("A problem ocurred during updating", "Commissions Report"); 
      } 
     } 
    }); 

अब नियंत्रक पर:

[HttpPost] 
    [JsonFilter(Param = "commissions", JsonDataType = typeof(List<CommissionsJs>))] 
    public ActionResult SubmitCommissions(List<CommissionsJs> commissions) 
    { 
     var result = dosomething(commissions); 
     var jsonData = new 
     { 
      Result = true, 
      Message = "Success" 
     }; 
     if (result < 1) 
     { 
      jsonData = new 
      { 
       Result = false, 
       Message = "Problem" 
      }; 
     } 
     return Json(jsonData); 
    } 

एक JsonFilter क्लास (जेएससी संदर्भ के लिए धन्यवाद) बनाएँ।

public class JsonFilter : ActionFilterAttribute 
    { 
     public string Param { get; set; } 
     public Type JsonDataType { get; set; } 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.ContentType.Contains("application/json")) 
      { 
       string inputContent; 
       using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream)) 
       { 
        inputContent = sr.ReadToEnd(); 
       } 
       var result = JsonConvert.DeserializeObject(inputContent, JsonDataType); 
       filterContext.ActionParameters[Param] = result; 
      } 
     } 
    } 

अन्य वर्ग बनाएँ ताकि फिल्टर वास्तविक manipulable वस्तु को JSON स्ट्रिंग पार्स कर सकते हैं: इस वर्ग comissionsJS मेरी jqGrid की सभी पंक्तियों कर रहे हैं।

public class CommissionsJs 
    { 
     public string Amount { get; set; } 

     public string CheckNumber { get; set; } 

     public string Contract { get; set; } 
     public string DatePayed { get; set; } 
     public string DealerName { get; set; } 
     public string ID { get; set; } 
     public string IdAgentPayment { get; set; } 
     public string Notes { get; set; } 
     public string PaymentMethodName { get; set; } 
     public string RowNumber { get; set; } 
     public string AgentId { get; set; } 
    } 

मुझे आशा है कि यह उदाहरण जटिल वस्तु को पोस्ट करने का तरीका बताएगा।

+0

डी वास्तव में जवाब! ; डी –

22

कार्रवाई फिल्टर, jQuery stringify, bleh ...

पीटर, इस कार्यक्षमता MVC के मूल निवासी है। यह उन चीजों में से एक है जो एमवीसी को इतना महान बनाता है।

$.post('SomeController/Batch', { 'ids': ['1', '2', '3']}, function (r) { 
    ... 
}); 

और कार्रवाई में,

[HttpPost] 
public ActionResult Batch(string[] ids) 
{ 
} 

वर्क्स एक आकर्षण की तरह:

enter image description here

आप jQuery 1.4 + का उपयोग कर रहे हैं, तो आप पारंपरिक स्थापित करने पर विचार करना चाहते हैं मोड:

jQuery.ajaxSettings.traditional = true; 

जैसा कि यहां बताया गया है: http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/02/24/jquery-1-4-breaks-asp-net-mvc-actions-with-array-parameters

यह जटिल वस्तुओं के लिए भी काम करता है। यदि आप रुचि रखते हैं, तो आपको मॉडल बाध्यकारी के बारे में एमवीसी दस्तावेज देखना चाहिए: http://msdn.microsoft.com/en-us/library/dd410405.aspx

+1

आप सही हो सकते हैं, लेकिन जेएसओएन मॉडल बाइंडर एमवीसी 3 के लिए नया है और 2008 में सवाल पूछा गया था जब यह समर्थित नहीं था। आपके उत्तर में उल्लेख करना उचित होगा। –

+3

_complex objects_ की सरणी को पारित करने का यह उदाहरण कैसा है? – DuckMaestro

+0

यह नहीं है लेकिन उदाहरण अभी भी लागू होता है (एमवीसी 3+)। जब तक आपके पैरामीटर नाम मॉडल के साथ मेल खाते हैं, आप उम्मीद कर रहे हैं कि आपको कोई समस्या नहीं होगी। –

10

.NET4.5, MVC 5 विजेट्स की कोई आवश्यकता नहीं है।

जावास्क्रिप्ट: जे एस में

वस्तु: enter image description here

तंत्र कि पोस्ट करता है।

$('.button-green-large').click(function() { 
     $.ajax({ 
      url: 'Quote', 
      type: "POST", 
      dataType: "json", 
      data: JSON.stringify(document.selectedProduct), 
      contentType: 'application/json; charset=utf-8', 
     }); 
    }); 

सी #

वस्तुओं:

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

    public List<ClaimedFee> ClaimedFees { get; set; } 
} 

public partial class ClaimedFee //Generated by EF6 
{ 
    public long Id { get; set; } 
    public long JourneyId { get; set; } 
    public string Title { get; set; } 
    public decimal Net { get; set; } 
    public decimal Vat { get; set; } 
    public string Type { get; set; } 

    public virtual Journey Journey { get; set; } 
} 

नियंत्रक:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Quote(WillsQuoteViewModel data) 
{ 
.... 
} 

वस्तु प्राप्त किया:

enter image description here

आशा है कि यह आपको कुछ समय बचाएगा।

-1
[HttpPost] 
    public bool parseAllDocs([FromBody] IList<docObject> data) 
    { 
     // do stuff 

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