asp.net-mvc-3 – MVC将JSON ViewModel传递给View

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – MVC将JSON ViewModel传递给View前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个MVC应用程序,我正在使用各种JsonResult端点来填充 javascript viewmodel.

我一直在使用几个jQuery Ajax请求来填充模型,但我希望将尽可能多的初始模型传递给服务器上的视图.

viewmodel有3-5个部分(取决于用户在应用程序中的位置):

>基本页面链接,这些链接不会经常更改,并且可能在整个用户的会话中完全相同
>用户通知.
>用户数据.
>(可选)可视数据
>(可选)misc数据

我目前正在使用此代码加载前三个部分:

  1. $(document).ready(function () {
  2.  
  3. ko.applyBindings(viewmodel);
  4. @Html.Raw(ViewBag.Script)
  5.  
  6. // Piece 1. Almost always the same thing
  7. postJSON('@Url.Action("HomeviewmodelJson","Home")',function (data) {
  8.  
  9. if (data == null)
  10. return;
  11.  
  12. for (var i in data.Tabs) {
  13. viewmodel.tabs.push({ name: data.Tabs[i] });
  14. }
  15.  
  16. for (var i in data.Buttons) {
  17. viewmodel.metroButtons.push({ name: data.MetroButtons[i] });
  18. }
  19.  
  20. for (var i in data.Ribbons) {
  21. viewmodel.ribbons.push(data.Ribbons[i]);
  22. }
  23. ApplyButtonThemes();
  24. });
  25. });
  26.  
  27.  
  28. // Piece 2. Changes constantly. OK as is
  29. postJSON('@Url.Action("GetNotifications","NotificationAsync")',function (nots) {
  30. viewmodel.notifications.removeAll();
  31.  
  32. ko.utils.arrayForEach(nots,function (item) {
  33. item.readNotification = function () {
  34. hub.markNotificationAsRead(this.Id);
  35. return true;
  36. };
  37. viewmodel.notifications.push(item);
  38. });
  39. });
  40.  
  41. // Piece 3. Changes but should also be loaded at startup
  42. postJSON('@Url.Action("GetUser","UserAsync")',function (user) {
  43. viewmodel.user(koifyObject(user));
  44. });
  45.  
  46.  
  47. postJSON = function(url,data,callback) {
  48. if($.isFunction(data)) {
  49. callback = data;
  50. data = {};
  51. }
  52. $.ajax({
  53. 'type': 'POST','url': url,'contentType': 'application/json','data': ko.toJSON(data),'dataType': 'json','success': callback
  54. });
  55. };

我尝试过这样的事情,但我发现使用@ Html.Action(“HomeviewmodelJson”,“Home”)会导致HTTP标头被更改,整个页面就像JSON一样被发送

  1. (function (data) {
  2.  
  3. if (data == null)
  4. return;
  5.  
  6. for (var i in data.Tabs) {
  7. viewmodel.tabs.push({ name: data.Tabs[i] });
  8. }
  9.  
  10. for (var i in data.MetroButtons) {
  11. viewmodel.metroButtons.push({ name: data.MetroButtons[i] });
  12. }
  13.  
  14. for (var i in data.Ribbons) {
  15. viewmodel.ribbons.push(data.Ribbons[i]);
  16. }
  17. ApplyMetroButtonThemes();
  18. })('@Html.Action("HomeviewmodelJson","Home")');

我想做的是在将页面发送给用户之前,使用现有的JsonResult端点将Json数据放入服务器端的viewmodel中.

是否有任何选项可以让我这样做而无需重写我的控制器?

解决方法

渲染主视图时,您正在使用视图模型,对吧?在此视图模型中,只需填充您不希望在返回视图之前使用AJAX获取属性
  1. public ActionResult Index()
  2. {
  3. Myviewmodel model = ...
  4. model.Prop1 = ...
  5. model.Prop2 = ...
  6. return View(model);
  7. }

例如,如果您有以下用于AJAX请求的操作:

  1. public JsonResult GetProp1()
  2. {
  3. Property1viewmodel model = ...
  4. return Json(model,JsonRequestBehavior.AllowGet);
  5. }

您可以在主操作中使用它来填充单个属性

  1. model.Prop1 = (Property1viewmodel)GetProp1().Data;
  2. model.Prop2 = (Property2viewmodel)GetProp2().Data;

然后在相应的视图中,您可以使用Json.Encode方法将整个模型序列化为JSON字符串:

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

或者,如果您不需要所有属性,也可以序列化各个属性

  1. @model Myviewmodel
  2. <script type="text/javascript">
  3. var prop1 = @Html.Raw(Json.Encode(Model.Prop1));
  4. </script>

猜你在找的asp.Net相关文章