.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赋一个有效的值

以上是几种主要的原因,如有其它问题欢迎补充,转载请注明出处

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值