这是我的剧本:
<script>
$(function () {
$("#selectUser").on("change", function () {
alert('button clicked');
var selectedUser = $(this).val();
if (selectedUser != null && selectedUser != '') {
$.getJSON('@Url.Action("GetAUsersRegisteredRoles")' + '/' + selectedUser, function (data) {
var dualSelect = $('#dualSelectRoles1');
dualSelect.empty();
$.each(data, function (index, data) {
dualSelect.append($('<option/>', {
value: index,
text: data.text
}));
});
});
}
}
);
});
这是我要更新的html元素:
<label>Select User</label>
<span class="field">
<select name="selectUser" id="selectUser">
<option value="">Choose One</option>
@foreach (var item in Model.Users)
{
<option value="@item.Id">@item.UserName</option>
}
</select>
</span>
<label>Select Roles</label>
<span class="dualselect">
<select name="RolesSelect" id="dualSelectRoles1" multiple="multiple" size="10">
<option value="">Admin</option>
<option value="">User</option>
<option value="">Technical</option>
<option value="">Sales</option>
<option value="">End User</option>
<option value="">Cient</option>
</select>
<span class="ds_arrow">
<span class="arrow ds_prev">«</span>
<span class="arrow ds_next">»</span>
</span>
<select name="select4" multiple="multiple" id="dualSelectRoles2" size="10">
<option value=""></option>
</select>
</span>
现在我的脚本工作到目前为止:
当我点击用户选择我的警告弹出窗口时,它会调用我的操作方法并返回json。
然后清除我的select元素使其变为空白但是它不添加任何元素?我做错了什么?
[编辑]
以下是我console.log(JSON.stringify(data))
的输出:
["Admin","Technical"]
答案 0 :(得分:1)
data
是一个字符串数组,因此没有属性text
。单独使用该值 - 从命名角度来看,最好将每个循环中data
的名称更改为更能指示变量代表的内容:
$.each(data, function (index, val) {
dualSelect.append($('<option/>', {
value: index,
text: val
}));
});
以上是example Fiddle。
答案 1 :(得分:0)
而不是
dualSelect.append($('<option/>', {
value: index,
text: data.text
}));
尝试
dualSelect.append('<option value="'+index+'">'+data+'</option>');
这是由于getJson调用返回一个字符串数组(例如[&#39; a&#39;,&#39; b&#39;,...])而不是您期望的对象(例如{ &#39; text&#39;:&#39; a&#39;,&#39; text&#39;:&#39; b&#39;})。因此,字符串数组没有属性&#39; text&#39;并将返回undefined。
答案 2 :(得分:0)
您的代码中存在一些需要考虑的重要问题。首先,虽然它不会导致任何直接的问题或错误,但是不能接受创建一个选项,它的选项没有价值,就像你的那样。所以你最好更改节点,如:
<option value="">Admin</option>
到
<option>Admin</option>
关于您的javascript代码,如果您希望您的数据如下:
data = [{text:"Admin"}, {text:"Technical"}];
然后创建像下列这样的选项是有意义的:
$('<option/>', { value: index, text: data0.text })
但是你看到你的数据只是一个字符串数组,所以代码中的所有相关部分都是(但我已经改变了):
var data = ["Admin","Technical"];
var dualSelect = $('#dualSelectRoles1');
dualSelect.empty();
$.each(data, function (index, value) {
dualSelect.append($('<option/>', {
value: index,
//text: data.text
text: value
}));
});
如您所见,我已在每个迭代器函数中将参数名称data
更改为value
,尽管在不同的闭包中使用重复的名称没有任何问题,但它会降低代码的可读性
答案 3 :(得分:0)
那里你犯的是一个很小的错误。试试这个:
var data = {text : "test"};
var dualSelect = $('#dualSelectRoles1').empty();
$.each(data, function (index, obj) {
dualSelect.append($('<option/>', {
value : index,
text : obj
}));
});