.net mvc Html.DropDownListFor 設定預設值無效
阿新 • • 發佈:2019-02-11
在專案中經常用到Html.DropDownListFor,但是很多時候使用的時候只能顯示候選列表,在後臺設定的預設值無法在前臺正確顯示;今天又遇到這個問題了,百度無果,在StackOverFlow上找到了答案,總結一下,希望幫到也被這個問題困擾的人。
先拋上沒錯誤的寫法:
下拉框的資料來源來源於enum中的項:
public enum VideoState {
[Display(Name ="等待收益")]
EmptyAvaiable =1,
[Display(Name ="可提現")]
WithDrawAvaiable =2,
[Display(Name ="申請提現" )]
ApplyWithDraw=3,
...
}
檢視模型中定義了該欄位State以及資料來源:
public class VideoEdit
{
...
public int State { get; set; }
public IEnumerable<SelectListItem>
StateList { get; set; }
}
【注意】上面State屬性的型別必須為int,不能是定義的 列舉型別VideoState
在檢視中如下使用:
@Html.DropDownListFor(m=>m.State ,Model.StateList)
控制器如下傳遞資料:
public ActionResult Edit(int? id){
...
Video v = db.Videos.Find(id);
...
VideoEdit m = new VideoEdit();
//這裡是將列舉類轉為IEnumerable<SelectListItem>
//型別的自定函式,引數是預設值
m.StateList = EnumExtention.ToSelectList<VideoState>
((int)v.State);
//這裡是檢視模型從實體模型繼承資料的自定義函式
return View(m.UpdateWithObject(v));
}
下面再分析一下容易錯的地方
1.很多才用了列舉的朋友應該是直接用列舉型別作為屬性的型別,比如:
public enum VideoState{
A=1,B=2
}
public class ViewModel{
...
public VideoState State{get;set;}
}
這裡State屬性的型別不能試VideoState了,必須是int,和SelectListItem中Value的型別保持一致,否則會出現設定了預設值,但沒有選中的情況
2.用ViewBag傳遞資料來源的名字和檢視模型中的名字相同,有衝突。比如:
public class employee_insignia
{
public int id{get;set;}
public string name{get;set;}
//This property will store insignia id
public int insignia{get;set;}
}
// If your ViewBag's name same as your property name
ViewBag.Insignia = new SelectList
(db.MtInsignia.AsEnumerable(),"id", "description", 1);
檢視:
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")
這樣也會導致預設值未被選中,應該採用如下寫法:
ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
檢視:
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
3.屬性State的值為null時,即使設定在IEnumerable 中設定了Selected=true也會出現未選中的情況
必須給State賦一個有效的值
以上是幾種主要的原因,如有其它問題歡迎補充,轉載請註明出處