简体   繁体   English

使用Javascript / jQuery动态填充下拉列表

[英]Fill a drop down list dynamically using Javascript/jQuery

In an ASP .NET MVC Razor view, I have a dropdown list as follows: 在ASP .NET MVC Razor视图中,我有一个下拉列表,如下所示:

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

DeviceModelList is just a SelectList. DeviceModelList只是一个SelectList。

How can I dynamically fill the DeviceModelList depending on a client side action like a button click or another drop down selection using Javascript/jQuery/Ajax? 如何根据客户端操作(如按钮单击或使用Javascript / jQuery / Ajax的其他下拉选项)动态填充DeviceModelList?

You could externalize this dropdown into a partial: 您可以将此下拉列表外部化为部分:

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

then in your main view include it inside some container: 然后在你的主视图中将它包含在一些容器中:

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

then you could have a controller action which takes some parameter and based on its value it renders this partial: 然后你可以有一个控制器动作,它采取一些参数,并根据它的值,它呈现这个部分:

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

Now the last part is to send the AJAX request to refresh the drop down list when some event occurs. 现在最后一部分是发送AJAX请求以在发生某些事件时刷新下拉列表。 For example when the value of some other ddl changes (or something else, a button click or whatever): 例如,当某些其他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);
            }
        });
    });
});

Another possibility consists into using JSON. 另一种可能性是使用JSON。 Your Foo controller action would only return some Json object containing the new key/value collection and in the success callback of the AJAX request you would refresh the drop down list. 您的Foo控制器操作只会返回一些包含新键/值集合的Json对象,并且在AJAX请求的成功回调中,您将刷新下拉列表。 In this case you don't need to externalize it into a separate partial. 在这种情况下,您无需将其外部化为单独的部分。 For example: 例如:

$(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
                        })
                    );
                });
            }
        });
    });
});

and finally your Foo controller action will return Json: 最后你的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' }
    });
}

For a similar example you may take a look at the following answer . 对于类似的示例,您可以查看以下答案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM