MVC无法加载资源:服务器响应状态为500(内部服务器错误)

时间:2015-08-07 11:55:15

标签: asp.net-mvc-4

我的第一个MVC项目有问题。我正在尝试在选择医生类型的DropDownList时更改姓氏DropDownList的值。我认为我的行动正在发挥作用。但是我不能在视图中使用结果。 这是我的代码:

$(function () {
            $('select#mCB').change(function () {
                var docId = $(this).val();

                $.ajax({
                    dataType: 'json',
                    data: 'spec=' + docId,
                    method: 'GET',
                    url: 'LoadDoctors',
                    success: function (data) {
                        $.each(data, function (key, Docs) {
                            $('select#shCB').append('<option value="0">Select One</option>');

                            $.each(Docs, function (index, docc) {
                                $('select#shCB').append(
                                    '<option value="' + docc.Id + '">' + docc.Name + '</option>');
                            });
                        });
                    },
                    error: function (docID) {

                        alert(' Error !');
            }
                });
            });
        });

操作:

public static List<Docs> GetDoctorBySpec(string spec)
        {
            List<Docs> list = new List<Docs>();

            string query = "select ID, Familiyasi, Speciality from Doktorlar where Speciality=@spec";
            SqlConnection Connection = new SqlConnection(DataBase.ConnectionString);
            Connection.Open();
            SqlCommand cmd = new SqlCommand(query, Connection);
            cmd.Parameters.Add("@spec", spec);
            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                list.Add(new Docs
                { 
                    Id = dr.GetString(0),
                    Name = dr.GetString(1)

                });
            }

            return list;
        }
enter code here
enter code here
[HttpGet]
    public ActionResult LoadDoctors(string spec)
    {
        List<Docs> list = DoctorsService.GetDoctorBySpec(spec);

        if (list == null)
        {
            return Json(null);
        }

        return Json(list);

    }

这是我的DropDownLists:

<div class="editor-label">
                @Html.LabelFor(model => model.DoktorTuri)
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(model => model.DoktorTuri, new SelectList(ViewBag.Vrachlar), new { @id = "mCB", @class = "vrachlar" })
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Shifokori)
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(model => model.Shifokori, Enumerable.Empty<SelectListItem>(), new { @id = "shCB", @class = "vrachlar" })
            </div>

我的错误在哪里?谢谢你的回答

2 个答案:

答案 0 :(得分:3)

500 (Internal Server Error)几乎总是意味着您在服务器上抛出异常。在你的情况下,最好的猜测是因为你的方法

DoctorsService.GetDoctorBySpec(spec);

不接受null作为参数,spec的值为null,因为您永远不会将其传递给控制器​​。正如stann1已经注意到你的ajax选项需要

data: {spec: docId},

此外,您没有指定JsonRequestBehavior.AllowGet参数,这意味着该方法将失败。

所有这些都可以通过调试代码来轻松确定,无论是在服务器上还是使用浏览器工具(特别是Network选项卡,以查看正在发送和接收的内容以及错误消息)

然而,这只是您的代码中的许多问题之一。

首先,除非Docs仅包含2个属性(选项的value属性和显示文本所需的值),否则通过向大量数据发送大量数据,不必要地浪费带宽和降低性能永远不会使用的客户。相反,发送一组匿名对象

[HttpGet]
public ActionResult LoadDoctors(string spec)
{
  List<Docs> list = DoctorsService.GetDoctorBySpec(spec);
  if (list == null)
  {
    return Json(null, JsonRequestBehavior.AllowGet);
  }
  var data = list.Select(d => new
  {
    Value = d.Id,
    Text = d.Name
  });
  return Json(data, JsonRequestBehavior.AllowGet);
}

接下来,您的脚本只会生成多个<option value="0">Select One</option>元素(集合中的每个项目都有一个),因为data中的$.each(data, function (key, Docs) {是您的集合,Docs是集合中的项目。您的第二个$.each()函数永远不会生成任何内容,因为Docs不是集合。

你的脚本应该是(注意我使用的是短版本$.getJSON()而不是更长的$.ajax(),并且还使用了html助手生成的默认id属性 - 它不清楚为什么您想要使用new { id = "mCB" }更改ID?)

var url = '@Url.Action("LoadDoctors")'; // never hard code your url's
var shifokori = $('#Shifokori'); // cache it
$('#DoktorTuri').change(function () {
  $.getJSON(url, { spec: $(this).val() }, function(data) {
    if (!data) { // only necessary depending on the version of jquery
      // oops
    }
    // clear existing options and append empty option with NULL value (not zero) 
    // so validation will work
    shifokori.empty().append($('<option></option>').val('').text('Select One'));
    $.each(data, function (index, doc) {
      shifokori.append($('<option></option>').val(doc.Value).text(doc.Text));
    });
  }).fail(function (result) {
    // oops
  });
});

答案 1 :(得分:1)

调用的数据参数必须是Javascript对象文字:

 $.ajax({
         dataType: 'json',
         data: {spec: docId},
         method: 'GET',
         ....
        });

另外,尝试调试控制器并使用rest扩展(或Fiddler)来测试有效负载,你会自己轻易捕获到这样的错误;)