我有一个服务器生成的对象,我需要转换为JSON对象供JavaScript使用。我更喜欢在视图渲染时将此JSON对象直接渲染到JS变量中以防止其他HTTP请求。
这是在我的控制器中:
public virtual JsonResult GetTheThings()
{
return Json(new
{
foo = "hello world",
bar = 3,
}, JsonRequestBehavior.AllowGet);
}
我可以直接在http://localhost:32243/MyController/GetTheThings
访问此内容,然后在浏览器中呈现以下内容。
{"foo":"hello world", "bar":3}
。完美!
所以,现在我基本上只想将这个视图的结果渲染成一个字符串。我该怎么做呢?我在下面所做的不工作,但希望它能给你这个想法。
这是我的尝试
<script>
var myObj = @Html.RenderPartial(MVC.MyController.GetTheThings());
</script>
请注意,我也在使用T4模板。
最后,这就是我想在视图中呈现的内容。
<script>
var myObj = {"foo":"hello world", "bar":3};
</script>
答案 0 :(得分:2)
由于您只希望在渲染视图时呈现对象(而不是来自AJAX调用),因此最好的选择可能是使其成为模型的一部分。创建一个字符串属性并将JSON保存为字符串,然后在视图中使用JSON.parse
将其转换为对象。
示例:
<script>
var myObj = JSON.parse("@Html.Raw(Model.JsonString)");
</script>
这种方式更加清洁,并且由于您没有通过AJAX请求对象,因此没有任何理由让控制器执行此操作。
答案 1 :(得分:1)
您可以像这样创建一个HtmlHelper扩展,而不是使用JsonResult,使用强类型视图(假设使用JSON.Net):
public static class HtmlHelperEx
{
public static string ToJson(this HtmlHelper html, object obj)
{
return JsonConvert.SerializeObject(obj);
}
}
控制器操作:
public ActionResult Index()
{
return View(new ModelToSerialize());
}
然后在您的视图中使用它,如:
@model ModelToSerialize
<script type="text/javascript">
var myObj = @Html.ToJson(Model)
</script>
答案 2 :(得分:0)
你理论上可以这样做:
<script>
var myObj = json.parse('@Html.RenderPartial(MVC.MyController.GetTheThings());');
</script>
虽然GetTheThings()
实际上不会在这里触发,但它只是一个T4MVC占位符。您应该将您的值存储到视图模型中,并将其放入javascript中,如下所示。如果要对控制器进行单独调用以获取此值,则需要进行ajax调用。
public class MyController
{
public ActionResult MyView(){
var vm = new MyViewModel();
vm.MyObjectAsJsonString = GetMyJsonString();
return View(vm);
}
public string GetMyJsonString(){
return ""; //get your json
}
}
public class MyViewModel
{
public string MyObjectAsJsonString{ get; set; }
}
@model MyViewModel
<script>
var myObj = json.parse('@Model.MyObjectAsJsonString');
</script>
通过ajax来实现:
<script>
$.ajax({
url: '@Url.Action(MVC.MyController.GetTheThings())',
type: 'get',
}).done(function (result){
var myObj = result;
});
</script>
答案 3 :(得分:0)
<script>
var myObj = '@Html.RenderPartial("Getthethings","controller name");'
</script>
答案 4 :(得分:0)
使用@ Html.Raw(...)包装器。
在我自己的项目中,我确实参考了控制器本身存在的现有模型,但没有理由你不能获得与部分相同的效果......它&#39 ; s并不是真正的使用异步调用的核心目的...你应该使用它而不是依赖于html渲染引擎来做你的“肮脏”。工作