2

当特定操作发生时,我想将 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);
            });
        });
    });

我打开了谷歌浏览器,我可以看到这样的请求和响应:

在此处输入图像描述

我可以看到我提醒的两个文本

但是,在我的选择器上,我只看到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");
}
4

2 回答 2

3

您没有在正确的变量上循环。

你这样做了:

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

而你应该这样做:

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

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

我也将替换:

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

和:

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

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

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

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

$('#buildingID').change(function () {
    var url = $(this).data('url');
    $.getJSON(url, { buildingID: $('#buildingID').val() }, function (data) {

好了,现在最初的烂摊子已经收拾好了。

于 2013-11-01T09:33:17.073 回答
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);
            });
        });
    });

希望这可以帮助...

于 2013-11-01T09:46:43.327 回答