我的第一个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>
我的错误在哪里?谢谢你的回答
答案 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)来测试有效负载,你会自己轻易捕获到这样的错误;)