2012-05-04 17 views
6

देखने के लिए जेएसओएन व्यू मॉडेल पास करें मेरे पास एक एमवीसी एप्लीकेशन है जो मैं जावास्क्रिप्ट व्यू मॉडेल को पॉप्युलेट करने के लिए विभिन्न JsonResult एंडपॉइंट्स का उपयोग कर रहा हूं।एमवीसी पास

मैं मॉडल को पॉप्युलेट करने के लिए कई jQuery अजाक्स अनुरोधों का उपयोग कर रहा हूं, लेकिन मैं सर्वर पर देखने के लिए जितना अधिक आंतरिक मॉडल पारित करना चाहता हूं।

  1. बेसिक पृष्ठ लिंक, ये बहुत अक्सर नहीं बदलते हैं और पूरे उपयोगकर्ता के भर में ठीक उसी हो सकता है:

    ViewModel 3-5 टुकड़े (जिसमें उपयोगकर्ता आवेदन में है के आधार पर) है सत्र

  2. उपयोगकर्ता सूचनाएं।
  3. उपयोगकर्ता डेटा।
  4. (वैकल्पिक) देखे जाने योग्य डेटा
  5. (वैकल्पिक) विविध डेटा

मैं वर्तमान में पहले तीन टुकड़े लोड करने के लिए इस कोड का उपयोग कर रहा हूँ:

$(document).ready(function() { 

    ko.applyBindings(viewModel); 
    @Html.Raw(ViewBag.Script) 

    // Piece 1. Almost always the same thing 
    postJSON('@Url.Action("HomeViewModelJson", "Home")', function (data) { 

     if (data == null) 
      return; 

     for (var i in data.Tabs) { 
      viewModel.tabs.push({ name: data.Tabs[i] }); 
     } 

     for (var i in data.Buttons) { 
      viewModel.metroButtons.push({ name: data.MetroButtons[i] }); 
     } 

     for (var i in data.Ribbons) { 
      viewModel.ribbons.push(data.Ribbons[i]); 
     } 
     ApplyButtonThemes(); 
    }); 
}); 


// Piece 2. Changes constantly. OK as is 
postJSON('@Url.Action("GetNotifications", "NotificationAsync")', function (nots) { 
    viewModel.notifications.removeAll(); 

    ko.utils.arrayForEach(nots, function (item) { 
     item.readNotification = function() { 
      hub.markNotificationAsRead(this.Id); 
      return true; 
     }; 
     viewModel.notifications.push(item); 
    }); 
}); 

// Piece 3. Changes but should also be loaded at startup 
postJSON('@Url.Action("GetUser", "UserAsync")', function (user) { 
    viewModel.user(koifyObject(user)); 
}); 


postJSON = function(url, data, callback) { 
    if($.isFunction(data)) { 
     callback = data; 
     data = {}; 
    } 
    $.ajax({ 
     'type': 'POST', 
     'url': url, 
     'contentType': 'application/json', 
     'data': ko.toJSON(data), 
     'dataType': 'json', 
     'success': callback 
    }); 
}; 

मैं कुछ इस तरह कर रही है की कोशिश की, लेकिन मुझे लगता है कि @Html.Action("HomeViewModelJson", "Home") का उपयोग करके HTTP शीर्षलेख बदलना पड़ रहा है और पूरा पृष्ठ भेजा गया है जैसे कि यह JSON

 (function (data) { 

      if (data == null) 
       return; 

      for (var i in data.Tabs) { 
       viewModel.tabs.push({ name: data.Tabs[i] }); 
      } 

      for (var i in data.MetroButtons) { 
       viewModel.metroButtons.push({ name: data.MetroButtons[i] }); 
      } 

      for (var i in data.Ribbons) { 
       viewModel.ribbons.push(data.Ribbons[i]); 
      } 
      ApplyMetroButtonThemes(); 
     })('@Html.Action("HomeViewModelJson", "Home")'); 

मैं जो करना चाहता हूं वह मौजूदा JsonResult एंडपॉइंट्स का उपयोग सर्वर पर भेजे जाने से पहले, सर्वर पक्ष पर जेसन डेटा को मेरे व्यूमोडेल में प्राप्त करने के लिए है।

क्या कोई विकल्प है जो मुझे अपने नियंत्रकों को फिर से लिखने की अनुमति देगा?

उत्तर

9

मुख्य दृश्य को प्रस्तुत करते समय आप एक दृश्य मॉडल का उपयोग कर रहे हैं, है ना? इस दृश्य मॉडल में बस दृश्य लौटने से पहले गुण है कि आप AJAX के साथ दिलवाया जा नहीं करना चाहती पॉप्युलेट:

public ActionResult Index() 
{ 
    MyViewModel model = ... 
    model.Prop1 = ... 
    model.Prop2 = ... 
    return View(model); 
} 

उदाहरण के लिए आप निम्न कार्रवाई कि AJAX अनुरोध के लिए प्रयोग किया जाता है अगर:

public JsonResult GetProp1() 
{ 
    Property1ViewModel model = ... 
    return Json(model, JsonRequestBehavior.AllowGet); 
} 

आप मुख्य कार्य से इसका इस्तेमाल कर सकते अलग-अलग प्रॉपर्टी को भरने के लिए:

model.Prop1 = (Property1ViewModel)GetProp1().Data; 
model.Prop2 = (Property2ViewModel)GetProp2().Data; 

और फिर इसी दृश्य के अंदर आपइस्तेमाल कर सकते हैंविधि JSON स्ट्रिंग में पूरे मॉडल को क्रमानुसार करने:

@model MyViewModel 
<script type="text/javascript"> 
    var model = @Html.Raw(Json.Encode(Model)); 
    // You could use model.Prop1 and model.Prop2 here 
</script> 

या आप भी अलग-अलग प्रॉपर्टी को क्रमानुसार यदि आप उन सभी की जरूरत नहीं है हो सकता है: जैसे कि यह काम हो सकता है

@model MyViewModel 
<script type="text/javascript"> 
    var prop1 = @Html.Raw(Json.Encode(Model.Prop1)); 
</script> 
+0

लगता है कि! मुझे इसे आज़माएं :) मुझे यह भी पता नहीं था कि यह संभव था! –

+0

स्वीकार करने के लिए भूल गए। महान काम किया! –

+0

+1 अच्छा ............. – SleepyBoBos

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