在初始页面加载时从服务器获取类对象并将其转换为js对象的好方法是什么?
本文关键字:对象 转换 js 是什么 方法 加载 获取 服务器 | 更新日期: 2023-09-27 18:03:08
目前,我在我的应用程序中做了这样的事情:
// Foo Controller
public ActionResult Details(int id)
{
ViewBag.id = id;
return View();
}
// Foo Details View
<script type="text/javascript">
var viewBag = {
'id': @ViewBag.id
};// *Note: MVC will cry about a syntax error here, everything's ok though
</script>
<script type="text/javascript" src="@Url.Content("~/Views/Foo/details.js")"></script>
// details.js
$(function(){
var jqXHR = $.ajax({
'url': '/api/foo/getData/' + viewBag.id,
'type': 'GET'
});
jqXHR.done(function(data){
...do stuff with data object...
});
});
// Foo Api Controller
// Instantiates the data class object to be serialized and returned
我这样做是因为在<javascript>
元素中,我不想让对象的一个巨大的JSON字符串挂在这里。理想情况下,我只想对Foo控制器进行一次调用,并使其实例化数据类对象,将其序列化为JSON字符串,并将其分配给ViewBag。数据模型或类似的东西。
当然我不能访问@ViewBag
内。js文件,因为它是一个服务器端对象。有没有人知道一种更简洁的方法来做这件事,而不是让这种不必要的来回?
一个想法是解析参数的URL,但这可能会变得丑陋,这取决于路由结构,我仍然需要等待视图的初始get
来获得js脚本来做所有这些,并且仍然最终不得不无论如何进行第二次调用。
我不知道它是否可能,但是否有一种方法,我可以动态地生成一个。js文件在视图创建期间,可以作为一个js ViewBag,将其添加到页面details.js文件加载之前,然后能够访问它的方式?或者可以动态修改details.js文件(如果需要最小化/捆绑,这可能不太理想)?
期望的结果是,我正在使用knockoutJS和我试图传递的初始对象是ViewModel,我想绑定到包含我想要使用的服务器的所有初始数据的页面。我从服务器获得的数据对象是ViewModel,我将其映射到一个可观察对象并绑定到DOM。我目前使用的方法似乎工作得很好,似乎没有太多的开销,但如果我能避免在页面初始加载时对服务器的第二次调用,那将是理想的。
首先,我不会将动态信息写入脚本标记。而是将数据编码为JSON,然后将其写入隐藏字段。
当您使用MVC4时,您将已经有对JSON的引用。所以你应该可以这样做:
控制器
public ActionResult Details(int id)
{
var myModel = GetMyModelData(id);
string modelJson = JsonConvert.SerializeObject(product);
return View(modelJson);
}
在视图中
<input type="hidden" id="model" value="@Model" />
在Javascript var modelJson = $('#model').val();
var modelObj = JSON.parse(modelJson);