使用JSonResult数据填充DropDown列表仅返回“undefined”

时间:2014-09-21 13:48:18

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

在我的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; }
}

1 个答案:

答案 0 :(得分:2)

替换 这一行:

$( "#GeographyType" ).append( '<option value="' + Type.ID + '">' + Type.Name + '</option>' );

这一个:

$( "#GeographyType" ).append( '<option value="' + Type.Value + '">' + Type.Text + '</option>' );

您将返回SelectList:这是SelectListItem的列表 - 没有ID和名称属性,只有textvalue属性

@Ehsan Sajjad的解释:

流线:

 new SelectList(db.GeographyTypes.Where(gt => gt.SectionID == SectionID), "ID", "Name")

使用列表,数据值字段和数据文本字段的指定项初始化SelectList类的新实例。这意味着在这种情况下,GeographyType.ID将映射到SelectListItem.Value,而GeographyType.Name将映射到SelectListItem.Text。因此,在这种情况下,在客户端,您只能访问ValueText属性。如果您想访问其他名称,则不应使用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);