2011-07-19 9 views
24

मैं एक एमवीसी 3 आवेदन पर काम कर रहा हूं। मेरे क्लाइंट साइड व्यूमोडेल में एक SQL सर्वर RowVersion प्रॉपर्टी है, जो बाइट [] है। इसे क्लाइंट साइड पर ऑब्जेक्ट सरणी के रूप में प्रस्तुत किया जाता है। जब मैं अपने व्यू मॉडल को नियंत्रक को पोस्ट करने का प्रयास करता हूं, तो रोवर्सियन प्रॉपर्टी हमेशा शून्य होती है।एमवीसी 3 - एक नियंत्रक को बाइट सरणी पोस्ट करना - डाटाबेस रोवरसन

मुझे लगता है कि नियंत्रक serializer (JsonValueProviderFactory) ऑब्जेक्ट सरणी संपत्ति को अनदेखा कर रहा है।

मैं इस ब्लॉग को देखा है, लेकिन इस पर लागू नहीं होता, जैसा कि मैंने JSON और नहीं प्रपत्र मार्कअप पोस्टिंग कर रहा हूँ:

<script type="text/javascript"> 
    var viewModel = @Html.Raw(Json.Encode(this.Model)); 
</script> 

मैं तो: http://thedatafarm.com/blog/data-access/round-tripping-a-timestamp-field-with-ef4-1-code-first-and-mvc-3/

मेरा विचार तो की तरह मेरे viewmodel renders इसलिए जैसे नियंत्रक से ViewModel पोस्ट:

:

var data = { 
     'contact': viewModel 
    }; 

    $.ajax({ 
     type: 'POST', 
     url: '/Contact/Save', 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify(data), 
     dataType: 'json', 
     success: function (data) { 
      // Success 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest.responseText); 
     } 
    }); 

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

[HttpPost] 
    public JsonResult Save(Contact contact) { 
    return this.Json(this._contactService.Save(contact)); 
    } 

अद्यतन: डारिन के उत्तर के आधार पर।

मैं एक क्लीनर समाधान की उम्मीद कर रहा था, लेकिन चूंकि डारिन ने एकमात्र उत्तर प्रदान किया, इसलिए मुझे एक कस्टम प्रॉपर्टी जोड़नी होगी जो मेरी बाइट [] "row_version" प्रॉपर्टी को बेस 64 स्ट्रिंग में क्रमबद्ध करेगी। और जब बेस 64 स्ट्रिंग को नई कस्टम प्रॉपर्टी पर सेट किया जाता है, तो यह स्ट्रिंग को बाइट [] में बदल देता है।

public byte[] row_version { 
    get; 
    set; 
    } 

    public string RowVersion { 
    get { 

     if(this.row_version != null) 
      return Convert.ToBase64String(this.row_version); 

     return string.Empty; 
    } 
    set { 

     if(string.IsNullOrEmpty(value)) 
      this.row_version = null; 
     else 
      this.row_version = Convert.FromBase64String(value); 
    } 
    } 
+0

अरे, आप अपने नियंत्रक कार्रवाई कोड पोस्ट कर सकते हैं? – Tocco

+0

अरे @ डारिन डिमिट्रोव, क्या आप 'क्रमबद्धता' टैग जोड़ सकते हैं? – Tocco

+0

@ टॉको, मैंने इसे जोड़ा है। –

उत्तर

36

मेरे क्लाइंट पक्ष ViewModel एक एसक्यूएल सर्वर RowVersion प्रॉपर्टी वाला है, जो है एक बाइट []

ऐसा बनाओ: नीचे कस्टम "RowVersion" संपत्ति है कि मैं अपने मॉडल को जोड़ा गया है कि byte[] के बजाय आपके व्यू मॉडल में string प्रॉपर्टी है जो base64 इस byte[] का प्रतिनिधित्व करती है। फिर आपको क्लाइंट को इसे पीछे छोड़ने और सर्वर पर वापस आने में कोई समस्या नहीं होगी, जहां आप बेस 64 स्ट्रिंग से मूल byte[] प्राप्त कर पाएंगे।

+0

+1 पुरानी पोस्ट में मदद नहीं मिली, लेकिन आज पूरी तरह से मेरी समस्या हल हो गई। – Nope

+1

'कनवर्ट करें। टोबेस 64 स्ट्रिंग (बाइट []) ' –

+0

बहुत अच्छा समाधान (+1)! – Christos

1

Json.NET स्वचालित रूप से बेस 64 के रूप में बाइट सरणी को एन्कोड करता है।

आप JsonNetResultJsonResult के बजाय का उपयोग कर सकते हैं:

https://gist.github.com/DavidDeSloovere/5689824 से

:

using System; 
using System.Web; 
using System.Web.Mvc; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 

public class JsonNetResult : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 

     var response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json"; 

     if (this.ContentEncoding != null) 
     { 
      response.ContentEncoding = this.ContentEncoding; 
     } 

     if (this.Data == null) 
     { 
      return; 
     } 

     var jsonSerializerSettings = new JsonSerializerSettings(); 
     jsonSerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; 
     jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     var formatting = HttpContext.Current != null && HttpContext.Current.IsDebuggingEnabled ? Formatting.Indented : Formatting.None; 
     var serializedObject = JsonConvert.SerializeObject(Data, formatting, jsonSerializerSettings); 
     response.Write(serializedObject); 
    } 
} 

उपयोग:

[HttpPost] 
public JsonResult Save(Contact contact) { 
    return new JsonNetResult { Data = _contactService.Save(contact) }; 
} 
संबंधित मुद्दे