【问题标题】:"Internal server error" returning SelectList through ajax“内部服务器错误”通过 ajax 返回 SelectList
【发布时间】: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个属性的匿名对象),它不包含CityIDName的属性-它的ValueText
  • 您没有更改任何数据(修改您的数据库),因此它可以是 GET,但也可以是 POST(这完全取决于您)。至于不返回任何数据,您需要调试您的代码。但是我建议你返回cities.Where(c =&gt; c.Name== name).Select(c =&gt; new { CityID = c.CityID, Name = c.Name });(返回SelectList没有意义,但是如果你这样做了,那么你需要将你的javascript更改为"&lt;option value=\"" + val.Value + "\"&gt;" + val.Text + "&lt;/option&gt;"

标签: c# jquery ajax asp.net-mvc-5


【解决方案1】:

感谢 Stephen Muecke,我已经解决了这个问题。查询也有错误。

我试图做的是一个级联选择列表,使用两个列表;第二个列表将根据第一个列表中的值填充。 所以 EF 查询应该是cities.Where(c=&gt;c.Country.Name==name),如下所示。但更重要的是,我收到内部服务器错误的原因是因为我使用 'GET' 而不是 'POST' 来获取我的数据。这需要在Json(...) 参数列表中添加JsonRequestBehaviour.AllowGet

public JsonResult GetCity(string name)
    {
        var cities = from c in context.Cities
                        orderby c.Name
                        select c;
        var chosenCities = cities.Where(c => c.Country.Name == name).Select(c => new{ Value = c.CityID, Text = c.Name });
        return Json(chosenCities, JsonRequestBehaviour.AllowGet);
    }

在 JS 代码中也有一些修改。当迭代返回的数据时,City 类的CityIDName 属性分别绑定到作为success 函数中的参数提供的对象的ValueText 属性。 这是修改后的代码:

  $(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.Value +
                            "\">" + val.Text + "</option>");
                    });
                },
                error: function(ex){
                    alert("Couldn't retrieve data: " + ex);
                }
                });                
        });
    });

感谢所有帮助解决此问题的人。

【讨论】:

  • 请阅读我的 cmets 来回答您的问题。您不应该创建SelectList - 它只是毫无意义的额外开销,并且意味着您将额外的数据(例如SelectListItemSelected 属性)发送到您甚至从未使用过的视图。只需创建一组匿名对象
  • “我收到内部服务器错误的原因是因为我使用的是 'GET' 而不是 'POST” 是什么意思?您正在按名称获取一个城市,这对我来说听起来像是一个典型的 GET 请求。
  • 阅读下面的句子,在粗体部分之后。如果在 return 语句中删除了第二个参数,则会引发错误。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2019-11-12
  • 2016-06-19
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多