如何从MVC控制器返回Json对象进行查看

时间:2013-03-04 07:23:49

标签: asp.net-mvc json

我正在做一个MVC应用程序,我需要将json对象从控制器传递到视图。

var dictionary = listLocation.ToDictionary(x => x.label, x => x.value);
return Json(new { values = listLocation}, JsonRequestBehavior.AllowGet);

上面的代码我在我的控制器中使用,现在当我部署视图页面时,它在我的浏览器中打开一个下载对话框,打开文件时它给了我json对象,因为我需要格式。

现在我想返回我的视图页面,也想访问视图页面中的json对象。我怎么能这样做。

4 个答案:

答案 0 :(得分:58)

执行return Json(...)时,您明确告诉MVC 不要使用视图,并提供序列化的JSON数据。您的浏览器会打开一个下载对话框,因为它不知道如何处理这些数据。

如果您想要返回一个视图,只需像往常那样return View(...)

var dictionary = listLocation.ToDictionary(x => x.label, x => x.value);
return View(new { Values = listLocation });

然后在您的视图中,只需将数据编码为JSON并将其分配给JavaScript变量:

<script>
    var values = @Html.Raw(Json.Encode(Model.Values));
</script>

修改

这是一个更完整的样本。由于我没有足够的上下文,因此此示例将采用控制器Foo,操作Bar和视图模型FooBarModel。此外,位置列表是硬编码的:

<强>控制器/ FooController.cs

public class FooController : Controller
{
    public ActionResult Bar()
    {
        var locations = new[]
        {
            new SelectListItem { Value = "US", Text = "United States" },
            new SelectListItem { Value = "CA", Text = "Canada" },
            new SelectListItem { Value = "MX", Text = "Mexico" },
        };

        var model = new FooBarModel
        {
            Locations = locations,
        };

        return View(model);
    }
}

<强>模型/ FooBarModel.cs

public class FooBarModel
{
    public IEnumerable<SelectListItem> Locations { get; set; }
}

<强>查看/富/ Bar.cshtml

@model MyApp.Models.FooBarModel

<script>
    var locations = @Html.Raw(Json.Encode(Model.Locations));
</script>

根据您的错误消息的外观,您似乎在混合不兼容的类型(即Ported_LI.Models.Locatio‌​nMyApp.Models.Location),因此,请回顾一下,确保从控制器操作端发送的类型与是从视图中收到的。特别是对于此示例,控制器中的new FooBarModel与视图中的@model MyApp.Models.FooBarModel匹配。

答案 1 :(得分:4)

您可以使用AJAX来调用此控制器操作。例如,如果您使用的是jQuery,则可以使用$.ajax()方法:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("NameOfYourAction")',
        type: 'GET',
        cache: false,
        success: function(result) {
            // you could use the result.values dictionary here
        }
    });
</script>

答案 2 :(得分:0)

<script type="text/javascript">
jQuery(function () {
    var container = jQuery("\#content");
    jQuery(container)
     .kendoGrid({
         selectable: "single row",
         dataSource: new kendo.data.DataSource({
             transport: {
                 read: {
                     url: "@Url.Action("GetMsgDetails", "OutMessage")" + "?msgId=" + msgId,
                     dataType: "json",
                 },
             },
             batch: true,
         }),
         editable: "popup",
         columns: [
            { field: "Id", title: "Id", width: 250, hidden: true },
            { field: "Data", title: "Message Body", width: 100 },
           { field: "mobile", title: "Mobile Number", width: 100 },
         ]
     });
});

答案 3 :(得分:-2)

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/Home/AutocompleteID",
    data: data,
    success: function (data) {
        $('#search').html('');
        $('#search').append(data[0].Scheme_Code);
        $('#search').append(data[0].Scheme_Name);
    }
});