如何在 ASP.NET MVC中将视图模型转换为JSON对象?

2022-08-30 02:24:34

我是一名Java开发人员,是.NET的新手。我正在处理一个.NET MVC2项目,我希望有一个部分视图来包装小部件。每个 JavaScript 小部件对象都有一个由模型数据填充的 JSON 数据对象。然后,当小组件中的数据发生更改或在另一个小组件中更改数据时,更新此数据的方法将绑定到事件。

代码如下所示:

MyController:

virtual public ActionResult DisplaySomeWidget(int id) {
  SomeModelView returnData = someDataMapper.getbyid(1);

  return View(myview, returnData);
}

myview.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModelView>" %>

<script type="text/javascript">
  //creates base widget object;
  var thisWidgetName = new Widget();

  thisWidgetName.updateTable = function() {
    //  UpdatesData
  };
  $(document).ready(function () {
    thisWidgetName.data = <% converttoJSON(model) %>
    $(document).bind('DATA_CHANGED', thisWidgetName.updateTable());
  });
</script>

<div><%:model.name%></div>

我不知道的是如何将数据发送过来,然后能够使用它来填充小部件并将其转换为JSON。我已经看到了一些真正简单的方法,可以在控制器中执行此操作,但在视图中却看不到。我认为这是一个基本问题,但我已经花了几个小时试图让它变得光滑。SomeModelView


答案 1

在mvc3中,使用剃须刀似乎可以解决问题。@Html.Raw(Json.Encode(object))


答案 2

做得好,您才刚刚开始使用MVC,并且您已经发现了它的第一个主要缺陷。

您并不真的想在视图中将其转换为 JSON,也不想在控制器中将其转换为 JSON,因为这两个位置都没有意义。不幸的是,你被困在这种情况中。

我发现要做的最好的事情是将JSON发送到ViewModel中的视图,如下所示:

var data = somedata;
var viewModel = new ViewModel();
var serializer = new JavaScriptSerializer();
viewModel.JsonData = serializer.Serialize(data);

return View("viewname", viewModel);

然后使用

<%= Model.JsonData %>

在您看来。请注意,标准的.NET JavaScriptSerializer非常糟糕。

在控制器中执行此操作至少使其可测试(尽管不完全像上述内容 - 您可能希望将ISerializer作为依赖项,以便您可以模拟它)

另外,关于你的JavaScript,最好包装你上面所有的小部件JS,如下所示:

(
    // all js here
)();

这样,如果您在页面上放置多个小部件,则不会遇到冲突(除非您需要从页面中的其他地方访问这些方法,但在这种情况下,您应该向某些小部件框架注册小部件)。现在可能不是问题,但是现在添加括号以节省将来成为要求时的工作量将是一种很好的做法,封装功能也是很好的OO实践。