下拉列表 以性別為例 綁定可以了,可以顯示了,但有些地方就能傳值,有些地方就會出錯提示,如有大神請指教。。。。 錯誤如下: 具有鍵“sex”的 ViewData 項屬於類型“YTgoShopping.Utilities.sex”,但它必須屬於類型“IEnumerable<SelectListItem ...
下拉列表 以性別為例
綁定可以了,可以顯示了,但有些地方就能傳值,有些地方就會出錯提示,如有大神請指教。。。。
錯誤如下:
具有鍵“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);
}
}
}
歡迎大神來訂正我!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!