1

目前,我在我的应用程序中做这样的事情:

// 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.dataModel 或类似的东西。

当然,我无法访问@ViewBag.js 文件,因为它是服务器端对象。有谁知道这样做的更整洁的方法,而不是来回有点不必要的?

一种想法是解析参数的 URL,但这可能会根据路由结构变得难看,我仍然需要等待get视图的初始值才能让 js 脚本完成所有这些工作,但最终还是不得不无论如何都要打第二个电话。

我不知道这是否可能,但有没有一种方法可以在创建视图期间动态生成一个 .js 文件,该文件可以用作 js ViewBag,在 details.js 文件加载之前将其添加到页面,然后能够以这种方式访问​​它吗?或者可以即时修改 details.js 文件(如果需要缩小/捆绑,这可能不是理想的)?

期望的结果是,我正在使用 knockoutJS,并且我试图传递的初始对象是我想要绑定到包含我想要使用的服务器的所有初始数据的页面的 ViewModel。我从服务器获取的数据对象是 ViewModel,我将其映射到可观察对象并绑定到 DOM。我正在使用的当前方法似乎工作正常并且似乎没有太多开销,但如果我可以避免在页面初始加载时对服务器进行第二次调用,那将是理想的。

4

1 回答 1

1

首先,我不会将动态信息写入脚本标签。而是将您的数据编码为 JSON,然后将其写入隐藏字段。

当您使用 MVC4 时,您已经有了对 JSON.NET 的引用,因此您应该能够做到这一点:

在控制器中

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);
于 2013-03-09T02:28:06.863 回答