我之前提出的一个问题也是如此。上一个问题中的问题是我试图使用html帮助程序调用控制器操作,但它是在外部.js文件中。
我现在将.ajax调用移动到视图中的脚本标记,但下拉列表仍未填充。当我在浏览器中查看网络选项卡时,我收到了500错误请求。
Ajax电话:
<script>
$(document).ready(function() {
$.ajax({
url: '@Url.Action("GetBranch", "Report")',
type: "GET",
success: $.each(function(result) {
$("#dropdown2").append('<option value=' + result.BranchId + '>' + result.BranchName + '</option>');
})
});
});
</script>
控制器操作:
public JsonResult GetBranch()
{
using (var entities = new TestEntities())
{
var branches = entities.Branches;
return Json(branches.Select(t => new { Text = t.BranchName, Value = t.BranchId }), JsonRequestBehavior.AllowGet);
}
}
此外,我不确定我是否正确使用$.each
。大约有100个分支机构。我无法使用@DropDownListFor
,因为我必须使用已存在的<select>
。我正确使用JsonResult
吗?
答案 0 :(得分:1)
这里发生的事情很少。总的来说,你接近这一点是正确的。一旦完成预测,.Select
将返回IEnumerable
。因此,投影对象集尚未枚举,仍然是附加到数据上下文的动态代理。
当进行序列化调用时,它会尝试序列化一个尚未枚举的对象,这是发生服务器错误的位置。请务必在那里调用.ToList()
来枚举可枚举的内容。
return Json(branches.Select(t => new {
Text = t.BranchName,
Value = t.BranchName //should this be t.BranchId ?
}).ToList(), JsonRequestBehavior.AllowGet);
///^^^^^^^^
另外,回到客户端,你怀疑jQuery是不正确的。每个都需要在success函数回调中调用,将成功结果传递给每个函数并使用this
引用每个返回的记录。
由于您的Select语句将BranchName投影到Text和BranchName为Value(... wait,是否应将BranchId转换为Value?),请确保您还引用了jquery回调中的那些内容。
success: function(result) {
//if there are so many results, it may be best to cache your selector
var dropdown2 = $("#dropdown2");
$.each(result, function(){
dropdown2.append('<option value=' + this.Value + '>' + this.Text + '</option>');
});
}
答案 1 :(得分:0)
您必须将function
而不是$.each
传递给success
并且$.each
也是错误的,请找到以下代码:
$.ajax({
url: '@Url.Action("GetBranch", "Report")',
type: "GET",
success: function (data) {
$.each(data, function(index, result) {
$("#dropdown2").append('<option value=' + result.BranchId + '>' + result.BranchName + '</option>');
})
}
});