我可以将JSON而不是Model从我的控制器传递到我的Razor视图

时间:2012-10-11 10:26:16

标签: asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-4

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

@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对象而不是模型对象从我的控制器传递给我的视图?

2 个答案:

答案 0 :(得分:4)

服务器端与客户端混淆

你在这里说两件事:

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

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

  3. 使用JSON

    的最佳解决方案

    为了在客户端上轻松使用JSON数据(在您的情况下它是一个包的数组)来生成结果填充的HTML,就是在客户端使用某种模板。 jQuery曾经有非最终的模板插件,now a separate project。我有很好的经验,但也有其他插件。使用您觉得最舒服的语法。

    放置这些模板的位置?

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

    2. 如果您不了解JSON对象的结构,那么您必须沿着JSON对象或单独的请求传递模板。

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

      不使用JSON的最佳解决方案

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

      你在这里获得了什么?好吧,假设你的应用程序中有这个功能:

      1. 您有一个显示包的分页列表的视图。
      2. 当用户第一次访问页面时,正在返回包的第一页
      3. 通过Ajax完成对下一页的分页,并且该列表将被返回的数据替换
      4. 如果您为后续Ajax请求创建部分视图,则可以在主视图中使用相同的部分视图来显示包的第一页。这将确保您只需更改一个部分视图,并且显示将在初始页面加载以及后续包分页时发生更改。

        如果您使用了view + JSON +模板,则意味着您必须维护包列表的两个演示文稿:第一页的视图中使用的那个和显示后续分页的模板。

        然后是哪一个?

        一切都是平等的,这使得第二种解决方案变得更好。但选择当然取决于你的情况(不平等的事情),你应该能够确定哪一个在你的情景中最好。

答案 1 :(得分: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);
    }
}

其中MyViewModel当然会反映您正在使用的JSON结构。