【发布时间】:2015-12-15 11:34:18
【问题描述】:
尝试从 .NET MVC 中的数据库中检索数据,并用它填充下拉列表。 控制器代码:
public JsonResult GetCity(string name)
{
var cities = from c in context.Cities
orderby c.Name
select c;
var chosenCities = cities.Where(c=>c.Name== name);
return Json(new SelectList(chosenCities, "CityID", "Name"));
}
jquery ajax 脚本:
$(function () {
var countrySelect = $("#country-dropdown");
var citySelect = $("#city-dropdown");
countrySelect.change(function () {
citySelect.prop("disabled", false);
citySelect.empty();
$.ajax({
method: "GET",
url: "@Url.Action("GetCity")",
data: { name: countrySelect.val() },
dataType: ("json"),
success: function(cities){
$.each(cities, function(i, val){
citySelect.append("<option value=\"" + val.CityID +
"\">" + val.Name + "</option>");
});
},
error: function(ex, status, err){
alert("Couldn't retrieve data: " + ex + " "
+ status + " " + err);
}
});
});
});
导致“内部服务器错误”。
【问题讨论】:
-
问题在于您的 C# 代码。从您的 LINQ 查询返回什么?您确定可以将
SelectList序列化为 JSON 吗?最好序列化一个类,然后根据它更新你的 UI。 -
您应该能够获得错误的更多详细信息,而不仅仅是“内部服务器错误”。内部服务器错误仅意味着您的服务器代码引发了某种未处理的异常。您应该有某种方式来记录和检索有关此错误的信息,或者您可以将调试器附加到服务器并查看异常。此异常将更准确地告诉您哪里出了问题。
-
@Chris 据我所知,服务器端没有未处理的异常。
-
使用浏览器工具检查响应(网络选项卡)以确定错误所在。你返回一个
SelectList(你应该只返回一个包含你需要的2个属性的匿名对象),它不包含CityID和Name的属性-它的Value和Text) -
您没有更改任何数据(修改您的数据库),因此它可以是 GET,但也可以是 POST(这完全取决于您)。至于不返回任何数据,您需要调试您的代码。但是我建议你返回
cities.Where(c => c.Name== name).Select(c => new { CityID = c.CityID, Name = c.Name });(返回SelectList没有意义,但是如果你这样做了,那么你需要将你的javascript更改为"<option value=\"" + val.Value + "\">" + val.Text + "</option>")
标签: c# jquery ajax asp.net-mvc-5