0

我有一个继承以下观点的观点: -

@model MvcApplication.Models.Application

但是我需要知道是否可以像传递模型对象一样将 JSON 对象传递给我的视图?因为我有以下控制器: -

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        var query = HttpUtility.ParseQueryString(string.Empty);
        //code goes here ....
        return Content(json, "application/json");
    }
}

它使用 API 调用返回 JSON,然后我使用 JavaScript 在视图上显示 JSON,如下所示:

 $.ajax({
            url: $('#geturl').data('url'),
            type: 'GET',
            cache: false,
            success: function (result) {
                $.each(result.data, function (key, val) {
                    var str = val.packageName;
                    $('<li/>', { text: str })
                        .appendTo($('#products'));
                });
            }

使用 JavaScript 显示 JSON 的问题在于,我很难轻松地使用 JSON 对象,例如基于返回的 JSON 创建链接或创建包含 JSON 的表。所以我的问题是:是否可以将 JSON 对象而不是 Model 对象从我的控制器传递到我的视图?

4

2 回答 2

4

服务器与客户端的混淆

你在这里说两件事:

  1. 创建视图:控制器将模型传递给服务器端的视图,使用 JSON 这样做没有多大意义,因为正在将内存中的对象传递给视图引擎。

  2. 在客户端使用 JSON 数据:您在这里谈论的是客户端-服务器 Ajax 通信,您从客户端请求数据并从服务器返回 JSON。这可以说与传递给视图的模型数据无关

使用 JSON 的最佳解决方案

为了在客户端上轻松使用 JSON 数据(在您的情况下是一组包)以生成生成的填充 HTML,需要在客户端使用某种模板。jQuery 曾经有非最终模板插件,现在是一个单独的项目。我有很好的经验,但也有其他插件。使用您对其语法最满意的一种。

把这些模板放在哪里?

  1. 如果您知道在创建视图时从服务器传递的 JSON 对象的结构,则可以将模板放在视图本身中,它们将等待直到在客户端上使用。

  2. 如果您不知道 JSON 对象的结构,则必须将模板传递给 JSON 对象或作为单独的请求。

第一种方法是通常的方法,第二种方法很少使用并且更具动态性。

不使用 JSON 的最佳解决方案

如果您不喜欢将 JSON 解析为 HTML 结果(手动或使用模板),您始终可以向控制器操作发出 Ajax 请求,这将返回准备好的 HTML 作为部分视图而不是 JSON 结果。这样,您可以轻松地将 HTML 放到您的页面上,而无需任何 JSON 数据操作。

你在这里有什么收获?好吧,假设您的应用程序中有此功能:

  1. 您有一个显示包的分页列表的视图。
  2. 当用户第一次访问页面时,包裹的第一页正在返回
  3. 分页到下一页是通过 Ajax 完成的,并且列表正在被返回的数据替换

如果要为后续的 Ajax 请求创建局部视图,则可以在主视图中使用相同的局部视图来显示包的第一页。这将确保您只需要更改一个局部视图,并且显示会在初始页面加载以及随后的包分页时发生变化。

如果您使用视图 + JSON + 模板,则意味着您必须维护包列表的两种表示形式:用于第一页的视图和显示后续分页的模板。

那是哪一个?

在所有条件相同的情况下,它使第二种解决方案更好。但是当然选择取决于您的情况(事情不相等),您应该能够确定哪一个在您的情况下是最好的。

于 2012-10-11T10:42:05.667 回答
1

不,你不能。视图必须是模型的强类型。因此,一种解决方案是将此 JSON 反序列化为模型对象,然后再将其传递给视图:

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        var query = HttpUtility.ParseQueryString(string.Empty);
        //code goes here ....

        var model = new JavaScriptSerializer().Deserialize<MyViewModel>(json);
        return View(model);
    }
}

whereMyViewModel当然会反映您正在使用的 JSON 结构。

于 2012-10-11T10:44:21.530 回答