将JsonResult渲染为Razor中的字符串

时间:2015-01-05 14:43:01

标签: c# asp.net-mvc json razor t4mvc

我有一个服务器生成的对象,我需要转换为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>

5 个答案:

答案 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渲染引擎来做你的“肮脏”。工作