8

我试图从我的控制器返回一个 Json 结果并使用 jQuery 填充一个选择列表。但是代码甚至没有在我的控制器中命中 Json 方法。

我的选择列表

<select id="MyList"></select>

我的 javascript

<script type="text/javascript">
    $(document).ready(function () {
        $.getJSON("@Url.Action("GetProductJson", "Product")", null, function (data) {
            $("#MyList").addItems(data);
        });
    });

    $.fn.addItems = function (data) {
        return this.each(function () {
            var list = this;
            $.each(data, function (index, itemData) {
                var option = new Option(itemData.Text, itemData.Value);
                list.add(option);
            });
        });
    };
</script>

我在 ProductController 中的 Json 方法

[HttpGet]
public JsonResult GetProductJson()
{
    var list = new List<SelectListItem>
           {
               new SelectListItem { Value = "1", Text = "Aron" },
               new SelectListItem { Value = "2", Text = "Bob" },
               new SelectListItem { Value = "3", Text = "Charlie" },
               new SelectListItem { Value = "4", Text = "David" }
           };

    return Json(list);
}
4

2 回答 2

6

您应该为默认禁用的 GET 请求启用 JSON。这通过将第二个参数传递给Json方法来实现:

return Json(list, JsonRequestBehavior.AllowGet);

现在继续安装FireBug。如果您在 StackOverflow 上发布此问题之前已经这样做了,您可能已经在浏览器中检查了 AJAX 请求,并且可能已经看到服务器返回 500 状态代码,并且当您检查响应时,您会看到确切的错误消息,而不仅仅是那-您还会看到有关如何修复它的建议。该建议基本上是我在回答中发布的内容。因此,您甚至不需要发布您的问题,因为您可以自己解决问题。我无法想象人们在没有诸如 FireBug 或 Chrome 开发者工具之类的工具的情况下进行 Web 开发。这就像试图在没有任何工具的情况下用自己的双手建造一座房子。

于 2013-01-22T09:53:07.383 回答
1

你需要JsonRequestBehavior.AllowGet在你的 json 方法中添加

来自 Phil haack 发布的JsonHijacking

默认情况下,ASP.NET MVC 框架不允许您使用 JSON 有效负载响应 HTTP GET 请求。如果您需要发送 JSON 以响应 GET,则需要通过使用 JsonRequestBehavior.AllowGet 作为 Json 方法的第二个参数来明确允许该行为。但是,恶意用户有可能通过称为 JSON 劫持的过程访问 JSON 有效负载。您不想在 GET 请求中使用 JSON 返回敏感信息。

于 2013-01-22T09:54:43.637 回答