.net mvc------下拉列表DropDownList控件------绑定数据

时间:2021-11-06 12:53:30

下拉列表 以性别为例

绑定可以了,可以显示了,但有些地方就能传值,有些地方就会出错提示,如有大神请指教。。。。

错误如下:

具有键“sex”的 ViewData 项属于类型“YTgoShopping.Utilities.sex”,但它必须属于类型“IEnumerable<SelectListItem>”。

具有键“sex”的 ViewData 项属于类型“Int32”,但它必须属于类型“IEnumerable<SelectListItem>”。

--------------------------------------

代码复制格式乱就用 ctrl+K+D

代码没写全,如果出现波浪线请 解析—引用

---------------------------------------

视图代码

//表达式,对象的集合,一个对象-----第一个为空的值

@Html.DropDownListFor(model => model.sex,ViewBag.sex as IEnumerable<SelectListItem>,“请选择性别”)

@Html.DropDownListFor(model => model.sex,ViewBag.sex as SelectList,“请选择性别”)

  //要放回窗体的名称---一般为model的字段,对象的集合,一个对象--第一个为空的值

@Html.DropDownList("sex",ViewBag.sex as IEnumerable<SelectListItem>,"请选择性别")

@Html.DropDownList("sex",(SelectList)ViewData["sex"],"请选择性别")

@Html.DropDownList("sex","请选择性别")

控制器代码

public ActionResult EditInfo(int id)
        {
            Admin Admins = db.Admins.Where(a => a.AdminID == id).FirstOrDefault();
            ViewBag.sex = new SelectList(EnumHelper.GetSelectList<sex>(),"Value","Text", Admins.sex);//这句可换
            return View(Admins);
        }

数据源为枚举的

//参数依次为数据集合,数据值,数据文本,选中项的值--默认项

ViewBag.sex = new SelectList(EnumHelper.GetSelectList<sex>(),"Value","Text", Admins.sex);

ViewData["sex"]= new SelectList(EnumHelper.GetSelectList<sex>(),"Value","Text", Admins.sex);

//参数依次为数据集合,选中项的值--默认项

  ViewBag.sex= new SelectList(Enum.GetValues(typeof(sex)), "");

数据源为表的

  ViewBag.list = new SelectList(db.sex, "Id", "Name", "");

枚举代码

public enum sex
    {
        女 = 0,
        男 = 1,
        其他 = 2,
    }

public enum sex
    {
        /// <summary> 
        /// 女 
        /// </summary> 
        [SelectDisplayName("女")]
        Female = 0,

/// <summary> 
        /// 男 
        /// </summary> 
        [SelectDisplayName("男")]
        Male = 1,

/// <summary> 
        /// 其他 
        /// </summary> 
        [SelectDisplayName("其他")]
        Other = 2
    }

用第二种枚举想要获取中文就要用以下方法

  获取枚举注释

namespace Common
{

/// <summary> 
    /// 自定义注解属性 
    /// </summary> 
    public class SelectDisplayNameAttribute : Attribute
    {
        private string _diaplayName;
        public string DisplayName
        {
            get
            {
                return _diaplayName;
            }
        }
        public SelectDisplayNameAttribute(string displayName)
        {
            _diaplayName = displayName;
        }

}

public class EnumHelper
    {
        /// <summary> 
        /// 获取自定义属性获取的内容 
        /// </summary> 
        /// <param name="obj"></param> 
        /// <returns></returns> 
        private static string GetEnumDescription(Object obj)
        {

//获取枚举对象的枚举类型 
            Type type = obj.GetType();
            //通过反射获取该枚举类型的所有属性 
            FieldInfo[] fieldInfos = type.GetFields();
            foreach (FieldInfo field in fieldInfos)
            {
                //不是参数obj,就直接跳过 
                if (field.Name != obj.ToString())
                {
                    continue;
                }
                //取出参数obj的自定义属性 
                if (field.IsDefined(typeof(SelectDisplayNameAttribute), true))
                {
                    return (field.GetCustomAttributes(typeof(SelectDisplayNameAttribute), true)[0] as SelectDisplayNameAttribute).DisplayName;
                }

}
            return obj.ToString();
        }

/// <summary> 
        ///  将枚举类型的值和自定义属性配对组合为 List<SelectListItem/>
        /// </summary> 
        /// <param name="enumType"></param> 
        /// <returns></returns> 
        public static List<SelectListItem> GetSelectList<T>(object defaultvalue=null)
        {
            var enumType = typeof(T);
            List<SelectListItem> selectList = new List<SelectListItem>();
            foreach (var obj in Enum.GetValues(enumType))
            {
                // 注意一定要Value = obj.ToString()  
                //原因是Value = (int)(obj.ToString()),这样取的枚举是对应的int值,在@Html.DropDownListFor中是无法显示默认选中值的,问题原因未解 
                selectList.Add(new SelectListItem { Text = GetEnumDescription(obj), Value = obj.ToString() });
            }
            return selectList;
        }
        public static string GetEnumName(Object obj)
        {
            return GetEnumDescription(obj);
        }
    }
}

欢迎大神来订正我!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!