【问题标题】:DropDownList Change() doesn't seem to fireDropDownList Change() 似乎没有触发
【发布时间】:2015-06-10 17:22:26
【问题描述】:

所以,我已经把头撞在桌子上了一天了。我知道这可能是一个简单的问题,但答案却让我难以捉摸。帮忙?

我在从局部视图构建的模式上有一个 DropDownList。我需要处理 DropDownList 上的 .Change(),将所选文本从 DropDownList 传递给控制器​​中的一个方法,然后该方法将为我提供要在 ListBox 中使用的数据。以下是我的研究导致我得到的代码 sn-ps。

modal 上的所有其他控件都完美运行。

任何人都可以看到我哪里出错了,或者可以指出我正确的方向吗?

进程控制器

// I have tried with [HttpGet], [HttpPost], and no attribute
public ActionResult RegionFilter(string regionName)
{
    // Breakpoint here is never hit
    var data = new List<object>();
    var result = new JsonResult();
    var vm = new PropertyModel();
    vm.getProperties();

    var propFilter = (from p in vm.Properties
                      where p.Region == regionName && p.Class == "Comparable"
                      select p).ToList();

    var listItems = propFilter.ToDictionary(prop => prop.Id, prop => prop.Name);

    data.Add(listItems);
    result.Data = data;
    return result;
}

剃刀视图

@section scripts{
    @Scripts.Render("~/Scripts/ui_PropertyList.js")
}

...

<div id="wrapper1">
    @using (Html.BeginForm())
    {
        ...

        <div id="fancyboxproperties" class="content">
            @Html.Partial("PropertyList", Model)
        </div>

        ...

        <input type="submit" name="bt_Submit" value="@ViewBag.Title" class="button" />
    }
</div>

Razor(局部视图“PropertyList.cshtml”)

... 

@{ var regions = (from r in Model.Properties
                select r.Region).Distinct(); }
<div>
    <label>Region Filter: </label>
    <select id="ddl_Region" name="ddl_Region">
        @foreach (var region in regions)
        {
            <option value=@region>@region</option>
        }
    </select>
</div>

// ListBox that needs to update after region is selected
<div> 
    @Html.ListBoxFor(x => x.Properties, Model.Properties.Where(p => p.Class == "Comparable")
        .Select(p => new SelectListItem { Text = p.Name, Value = p.Id }),
        new { Multiple = "multiple", Id = "lb_C" })
</div>

...

JavaScript (ui_PropertyList.js)

$(function () {

    // other events that work perfectly
    ...

    $("#ddl_Region").change(function () {
            $.getJSON("/Process/RegionFilter/" + $("#ddl_Region > option:selected").attr("text"), updateProperties(data));
        });
});

function updateProperties(data, status) {
    $("#lb_C").html("");
    for (var d in data) {
        var addOption = new Option(data[d].Value, data[d].Name);
        addOption.appendTo("#lb_C");
    }
}

【问题讨论】:

  • 我只是做一个评论:如果您使用DropDownListFor Helper,则需要使用Multiple = "multiple"。但你不是,所以你不需要它。这是一个冗余,ListBox Helper 已经能够接受多个值。

标签: javascript c# asp.net-mvc razor


【解决方案1】:

传递给$.getJSON 方法的回调函数是错误的。您需要将 reference 传递给函数,而不是调用它。

试试这个:

$.getJSON("/Process/RegionFilter/" + $("#ddl_Region > option:selected").text(), updateProperties);

另外,为了得到选中的下拉选项的文本,你需要使用text()函数:

$("#ddl_Region > option:selected").text()

Documentation

【讨论】:

  • 是的 - 很确定数据是 ajax 响应,在这种情况下这是最好的解决方案。
  • 评论不用于扩展讨论;这个对话是moved to chat