用AJAX源代码填充MVC DropdownList并绑定所选值

用AJAX源代码填充MVC DropdownList并绑定所选值,ajax,asp.net-mvc,html.dropdownlistfor,Ajax,Asp.net Mvc,Html.dropdownlistfor,我可以查看会员详细信息。里面有一个EditorFor元素,它表示成员所使用的主题 @Html.EditorFor(m => m.Subject) 在编辑器模板中有一个Html.DropDownListFor(),它显示所选主题和删除该主题的按钮 我使用Html.DropDownListFor元素作为: @Html.DropDownListFor(m => m.SubjectID, Enumerable.Empty<SelectListItem>(), "Select

我可以查看会员详细信息。里面有一个EditorFor元素,它表示成员所使用的主题

 @Html.EditorFor(m => m.Subject)
在编辑器模板中有一个Html.DropDownListFor(),它显示所选主题和删除该主题的按钮

我使用Html.DropDownListFor元素作为:

@Html.DropDownListFor(m => m.SubjectID, Enumerable.Empty<SelectListItem>(), "Select Subject", 
new { @class = "form-control subjects" }) 
@Html.DropDownListFor(m=>m.SubjectID,Enumerable.Empty(),“选择主题”,
新的{@class=“表单控件主题”})
第二个参数(source)设置为空,因为我想从AJAX请求加载源代码;如下图所示:

$.getJSON(url, function (response) {
         $.each(response.Subjects, function (index, item) { 
                $('.subjects').append($('<option></option>').text(item.Text).val(item.ID));
            });
         // code to fill other dropdowns
    });
$.getJSON(url、函数(响应){
$。每个(应答。受试者,功能(索引,项目){
$('.subjects').append($('.text)(item.text).val(item.ID));
});
//用于填充其他下拉列表的代码
});
当前,在填充下拉列表之前加载html。因此,所有主题下拉列表的值都设置为默认的“选择主题”。有办法解决这个问题吗?还是方法不对

注意:此页面中有许多下拉列表。这就是为什么我更愿意加载一个AJAX请求并缓存它,而不是放入viewModel并为每个请求填充它

**编辑**


在AJAX调用中,该操作返回一个json对象,其中包含所有页面中使用的下拉列表。此操作由
[Output Cache]
修饰,以避免频繁访问服务器。更改了
$中的代码。每个
都反映了这一点。

如果JSON告诉您他们选择了什么选项,您只需在填充下拉列表后执行以下操作:

$('.form-control.subjects').get(0).selectedIndex = [SELECTED_INDEX];

其中,[SELECTED_INDEX]是要在下拉列表中选择的元素的索引。

您可以首先将属性的值分配给javascript变量,并在添加选项后使用该值在ajax回调中设置所选选项的值

// Store initial value
var selectedId = @Html.Raw(Json.Encode(Model.Subject.SubjectID))
var subjects = $('.subjects'); // cache it

$.getJSON(url, function (response) {
    $.each(response, function (index, item) { 
        subjects.append($('<option></option>').text(item.Text).val(item.ID));
    });
    // Set selected option
    subjects.val(selectedId);
});
然后需要在循环中设置每个dropdownlist值

$.each(subjects, function(index, item) {
    $(this).val(selectedIds[index]);
});

谢谢您的回复。:)我们已经更新了问题。我会按照你的建议尝试你的更新没有什么意义。如果您希望缓存选项,因为它们很少更改,则可以使用
MemoryCache
缓存它们(如果数据更新,则缓存将失效)。对于典型的包装器类,请参阅编辑以包含缺少的详细信息
$.each(subjects, function(index, item) {
    $(this).val(selectedIds[index]);
});