试图返回json并填充selectlist

时间:2013-01-22 09:51:56

标签: c# jquery asp.net-mvc

我试图从我的控制器返回一个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);
}

2 个答案:

答案 0 :(得分:6)

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

return Json(list, JsonRequestBehavior.AllowGet);

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

答案 1 :(得分:1)

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

来自Phil haack post JsonHijacking

  

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