1. 程式人生 > >.net mvc Html.DropDownListFor 設定預設值無效

.net mvc Html.DropDownListFor 設定預設值無效

在專案中經常用到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賦一個有效的值

以上是幾種主要的原因,如有其它問題歡迎補充,轉載請註明出處