在我的ASP.Net MVC 5项目中,我尝试使用AJAX进行级联DropDownList。 JSON结果动作似乎正在起作用,jQuery代码似乎也工作唯一的问题是DropDownList填充了" undefined"。
JsonResult:
public JsonResult GetSectionGeographyTypes(Int16 SectionID)
{
try
{
IEnumerable<SelectListItem> GeographyTypes;
using (GeographyContext db = new GeographyContext())
{
GeographyTypes = new SelectList(db.GeographyTypes.Where(gt => gt.SectionID == SectionID), "ID", "Name").ToList();
}
return Json(new SelectList(GeographyTypes), JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
throw new HttpException(500, "Error processing request.");
}
}
AJAX:
$.ajax( {
type: 'POST',
url: '@Url.Action("GetSectionGeographyTypes")',
dataType: 'json',
data: { SectionID: $( "#Section" ).val() },
success: function ( GeographyTypes )
{
$.each( GeographyTypes, function ( i, Type )
{
$( "#GeographyType" ).append( '<option value="' + Type.ID + '">' + Type.Name + '</option>' );
} );
},
error: function ( xhr, err )
{
alert( "readyState: " + xhr.readyState + "\nstatus: " + xhr.status );
alert( "responseText: " + xhr.responseText );
}
} );
我已经测试过使用查询直接填充DropDownList,它运行正常。我做错了什么?
编辑:
public class GeographyType
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required, Index("IX_Geography_Type", 1, IsUnique = true)]
public string Name { get; set; }
[Required, Index("IX_Geography_Type", 2, IsUnique = true)]
public Int16 SectionID { get; set; }
public string Description { get; set; }
[ForeignKey("SectionID")]
public virtual Section Section { get; set; }
}
答案 0 :(得分:2)
替换 这一行:
$( "#GeographyType" ).append( '<option value="' + Type.ID + '">' + Type.Name + '</option>' );
这一个:
$( "#GeographyType" ).append( '<option value="' + Type.Value + '">' + Type.Text + '</option>' );
您将返回SelectList
:这是SelectListItem
的列表 - 没有ID和名称属性,只有text
和value
属性
@Ehsan Sajjad的解释:
流线:
new SelectList(db.GeographyTypes.Where(gt => gt.SectionID == SectionID), "ID", "Name")
使用列表,数据值字段和数据文本字段的指定项初始化SelectList
类的新实例。这意味着在这种情况下,GeographyType.ID
将映射到SelectListItem.Value
,而GeographyType.Name
将映射到SelectListItem.Text
。因此,在这种情况下,在客户端,您只能访问Value
和Text
属性。如果您想访问其他名称,则不应使用SelectList
。
要在代码中尝试访问属性,您应该执行以下操作:
var geographyTypes = db.GeographyTypes.Where(gt => gt.SectionID == SectionID).Select(x=> new
{
ID = x.ID,
Name = x.Name
}).ToList();
return Json(geographyTypes, JsonRequestBehavior.AllowGet);