【问题标题】:Fill a drop down list dynamically using Javascript/jQuery使用 Javascript/jQuery 动态填充下拉列表
【发布时间】:2011-08-31 06:10:00
【问题描述】:

在 ASP .NET MVC Razor 视图中,我有一个下拉列表,如下所示:

@Html.DropDownListFor(model => model.SelectedDeviceModel, Model.DeviceModelList)

DeviceModelList 只是一个 SelectList。

如何根据客户端操作(如单击按钮或使用 Javascript/jQuery/Ajax 的其他下拉选择)动态填充 DeviceModelList?

【问题讨论】:

    标签: javascript jquery .net asp.net-mvc ajax


    【解决方案1】:

    您可以将此下拉列表外部化为部分:

    @model MyViewModel
    @Html.DropDownListFor(model => model.SelectedDeviceModel, Model.DeviceModelList)
    

    然后在您的主视图中将其包含在某个容器中:

    @model MyViewModel
    ...
    <div id="ddlcontainer">
        @Html.Partial("Foo", Model)
    </div>
    ...
    

    然后你可以有一个控制器动作,它接受一些参数并根据它的值呈现这个部分:

    public ActionResult Foo(string someValue)
    {
        MyViewModel model = ... go ahead and fill your view model
        return PartialView(model);
    }
    

    现在最后一部分是在某些事件发生时发送 AJAX 请求以刷新下拉列表。例如,当其他一些 ddl 的值发生变化时(或其他东西,按钮单击或其他):

    $(function() {
        $('#SomeOtherDdlId').change(function() {
            // when the selection of some other drop down changes 
            // get the new value
            var value = $(this).val();
    
            // and send it as AJAX request to the newly created action
            $.ajax({
                url: '@Url.Action("foo")',
                type: 'POST',
                data: { someValue: value },
                success: function(result) {
                    // when the AJAX succeeds refresh the ddl container with
                    // the partial HTML returned by the Foo controller action
                    $('#ddlcontainer').html(result);
                }
            });
        });
    });
    

    另一种可能性是使用 JSON。您的Foo 控制器操作只会返回一些包含新键/值集合的 Json 对象,并且在 AJAX 请求的成功回调中,您将刷新下拉列表。在这种情况下,您不需要将其外部化为单独的部分。例如:

    $(function() {
        $('#SomeOtherDdlId').change(function() {
            // when the selection of some other drop down changes 
            // get the new value
            var value = $(this).val();
    
            // and send it as AJAX request to the newly created action
            $.ajax({
                url: '@Url.Action("foo")',
                type: 'POST',
                data: { someValue: value },
                success: function(result) {
                    // when the AJAX succeeds refresh the dropdown list with 
                    // the JSON values returned from the controller action
                    var selectedDeviceModel = $('#SelectedDeviceModel');
                    selectedDeviceModel.empty();
                    $.each(result, function(index, item) {
                        selectedDeviceModel.append(
                            $('<option/>', {
                                value: item.value,
                                text: item.text
                            })
                        );
                    });
                }
            });
        });
    });
    

    最后你的 Foo 控制器动作将返回 Json:

    public ActionResult Foo(string someValue)
    {
        return Json(new[] {
            new { value = '1', text = 'text 1' },
            new { value = '2', text = 'text 2' },
            new { value = '3', text = 'text 3' }
        });
    }
    

    对于类似的示例,您可以查看following answer

    【讨论】:

    • 使用部分是我要走的路。谢谢!
    • @DarinDimitrov 我已经实现了您的解决方案,但是我添加了第二个 ajax 请求,因为根据用户下拉选择,另一个 ddl 会填充值。我的问题是第二个 ajax 请求没有触发。你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多