C# 使用视图模型中的MVC视图返回JsonResult数据

C# 使用视图模型中的MVC视图返回JsonResult数据,c#,javascript,asp.net-mvc,C#,Javascript,Asp.net Mvc,我目前使用Knockout在页面加载后动态加载数据。我使用的是控制器方法,比如: public JsonResult GetData(int paramId) { return Json(new { Field1: true }); } 这就是所谓的like(在JS中): 在这里,数据对象是一个已经可以被JS访问的对象 当我想刷新单个项目时,这种方法很好,但它使初始加载效率相当低-需要进行大量调用来初始化页面。 在加载视图的ActionResult方法中,我想调用GetData()并以

我目前使用Knockout在页面加载后动态加载数据。我使用的是控制器方法,比如:

public JsonResult GetData(int paramId)
{
    return Json(new { Field1: true });
}
这就是所谓的like(在JS中):

在这里,
数据
对象是一个已经可以被JS访问的对象

当我想刷新单个项目时,这种方法很好,但它使初始加载效率相当低-需要进行大量调用来初始化页面。 在加载视图的
ActionResult
方法中,我想调用
GetData()
并以与上面提到的ajax调用中的
data
值匹配的方式返回结果

我怎样才能做到这一点?我假设需要将调用的结果添加到视图的模型中,然后将值分配给视图中的JS变量

比如:

public ActionResult Index() {
    var iModel = new IndexModel();
    iModel.DataResults = GetData();
    return View(iModel);
}
var dataHolder = @Model.DataResults;
然后在视图本身中,类似于:

public ActionResult Index() {
    var iModel = new IndexModel();
    iModel.DataResults = GetData();
    return View(iModel);
}
var dataHolder = @Model.DataResults;
这不起作用,我只得到类型的命名,而不是实际数据,因为它将存在于ajax调用中的
data
变量中


如何实现这一点?

您可以使用JSON将视图模型序列化为javascript变量:

@model MyViewModel
<script type="text/javascript">
    var dataHolder = @Html.Raw(Json.Encode(Model));
    // At this stage you could use the dataHolder variable
    // that will contain all information about your view model
</script>
@model MyViewModel
var dataHolder=@Html.Raw(Json.Encode(Model));
//在此阶段,您可以使用dataHolder变量
//将包含有关视图模型的所有信息

现在,
dataHolder
javascript变量将保存传递给视图的整个视图模型。您将可以访问它的所有属性,并且不需要执行昂贵的AJAX请求。只有在用户进行一些输入后,而不是在初始页面加载时,您才需要从服务器获取一些新数据。SPAs的全部目的是,您的视图可以以视图模型的形式提供尽可能多的初始信息,您可以将视图模型JSON序列化为一个简单的javascript变量。

您可以将视图模型JSON序列化为一个javascript变量:

@model MyViewModel
<script type="text/javascript">
    var dataHolder = @Html.Raw(Json.Encode(Model));
    // At this stage you could use the dataHolder variable
    // that will contain all information about your view model
</script>
@model MyViewModel
var dataHolder=@Html.Raw(Json.Encode(Model));
//在此阶段,您可以使用dataHolder变量
//将包含有关视图模型的所有信息

现在,
dataHolder
javascript变量将保存传递给视图的整个视图模型。您将可以访问它的所有属性,并且不需要执行昂贵的AJAX请求。只有在用户进行一些输入后,而不是在初始页面加载时,您才需要从服务器获取一些新数据。SPAs的全部目的是,您的视图可以以视图模型的形式提供尽可能多的初始信息,您可以将其JSON序列化为一个简单的javascript变量。

谢谢您的回复。当我尝试你的建议时,我得到一个错误,说Json没有
Serialize
方法。对不起,我犯了一个错误,它是
Json.Encode
,而不是
Json.Serialize
。我已经更新了我的答案来解决这个问题。谢谢你的回复。当我尝试你的建议时,我得到一个错误,说Json没有
Serialize
方法。对不起,我犯了一个错误,它是
Json.Encode
,而不是
Json.Serialize
。我已经更新了我的答案来解决这个问题。