我有一个继承以下内容的观点: -
@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对象而不是模型对象从我的控制器传递给我的视图?
答案 0 :(得分:4)
你在这里说两件事:
创建视图:控制器将模型传递给服务器端的视图,使用JSON这样做没有多大意义,因为内存中的对象正在传递给视图引擎。 / p>
在客户端上使用JSON数据:您在这里谈论的是客户端 - 服务器Ajax通信,您从客户端请求数据并从服务器返回JSON。这个可以说与传递给视图的模型数据无关
为了在客户端上轻松使用JSON数据(在您的情况下它是一个包的数组)来生成结果填充的HTML,就是在客户端使用某种模板。 jQuery曾经有非最终的模板插件,now a separate project。我有很好的经验,但也有其他插件。使用您觉得最舒服的语法。
如果您知道在创建视图时从服务器传递的JSON对象的结构,您可以将模板放在视图本身中,它们只是等待,直到在客户端上使用。
如果您不了解JSON对象的结构,那么您必须沿着JSON对象或单独的请求传递模板。
第一种方法是通常的方法,第二种方法很少使用,而且更具动态性。
如果您不想将JSON解析为HTML结果(手动或使用模板),您可以随时向控制器操作发出Ajax请求,这会将准备好的HTML作为部分视图而不是JSON结果返回。这样,您可以轻松地将HTML放到页面上,而无需任何JSON数据操作。
你在这里获得了什么?好吧,假设你的应用程序中有这个功能:
如果您为后续Ajax请求创建部分视图,则可以在主视图中使用相同的部分视图来显示包的第一页。这将确保您只需更改一个部分视图,并且显示将在初始页面加载以及后续包分页时发生更改。
如果您使用了view + JSON +模板,则意味着您必须维护包列表的两个演示文稿:第一页的视图中使用的那个和显示后续分页的模板。
一切都是平等的,这使得第二种解决方案变得更好。但选择当然取决于你的情况(不平等的事情),你应该能够确定哪一个在你的情景中最好。
答案 1 :(得分:1)
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结构。