jquery MVC4收到JSON

时间:2013-11-01 08:56:30

标签: javascript jquery asp.net-mvc json asp.net-mvc-4

我希望在发生特定操作时将控制器中的json数据发送到我的视图。

我在控制器上使用它来发送数据

[HttpGet] 
 public JsonResult JSONGetParking(int buildingID){

     return this.Json(
                          new
                          {
                              Result = (from obj in db.Parkings.Where(p => p.buildingID == buildingID) select new { ID = obj.ID, Name = obj.note })
                          }
                          , JsonRequestBehavior.AllowGet
                       );
}

效果很好

在我的脚本上我使用了这个:

FloorScript.js

$(document).ready(function () {
        $('#buildingID').change(function () {
            alert("what is not");
            $.getJSON('JSONGetParking?buildingID=' + $('#buildingID').val(), function (data) {
                alert("afd");
                var items = " ";
                $.each(data, function (obx, oby) {
                    items += "<option value='" + oby.ID + "'>" + oby.Name + "</option>";
                });
                $('#parkingID').html(items);
            });
        });
    });

我已经打开谷歌浏览器,我可以看到请求和响应,如下所示:

enter image description here

我可以看到我发出警告的两个文字

但是,在我的选择器上,我只看到undefined value

HTML

<div id="editor-label">
        <select id="parkingID" name="parkingID"></select>
    </div>

我在此

中添加了jquery
@section scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/Scripts/FloorScript.js");
}

2 个答案:

答案 0 :(得分:3)

你没有循环使用正确的变量。

你这样做了:

$.each(data, function (obx, oby) {

而你应该这样做:

$.each(data.Result, function (obx, oby) {

这在您提供的Google Chrome屏幕截图中非常明显。正如您所看到的,返回的JSON有一个名为Result的属性,它是集合,而您循环遍历不是数组的data变量 - 它只是一个具有名为{{的属性的javascript对象1}}这是你想要循环的数组。

我也会替换:

Result

使用:

$.getJSON('JSONGetParking?buildingID=' + $('#buildingID').val(), function (data) {

当然在那里摆脱这个硬编码的url并使用url helper生成它,在下拉列表中显示为HTML5 data- *属性:

$.getJSON('JSONGetParking', { buildingID: $('#buildingID').val() }, function (data) {

然后在更改事件中,您可以轻松地检索此URL并避免对其进行硬编码(当然,当您在虚拟目录中的IIS中部署代码时,可能会冒破坏代码的风险,或者只是更改应用程序的路由模式):

@Html.DropDownListFor(
    x => x.BuildingId, 
    Model.Buildings, 
    new { 
        id = "buildingID", 
        data_url = Url.Action("JSONGetParking") 
    }
)

好吧,现在最初的一塌糊涂了。

答案 1 :(得分:2)

在每个循环中使用data.Result

$(document).ready(function () {
        $('#buildingID').change(function () {
            alert("what is not");
            $.getJSON('JSONGetParking?buildingID=' + $('#buildingID').val(), function (data) {
                alert("afd");
                var items = " ";
                $.each(data.Result, function (obx, oby) {
                    items += "<option value='" + oby.ID + "'>" + oby.Name + "</option>";
                });
                $('#parkingID').html(items);
            });
        });
    });

希望这会有所帮助......