2014-12-04 90 views
0

今天我在ASP.NET的SelectList中遇到了默认值的问题。SelectList默认值不起作用

这里是我想很多的事情后,我怎么在网上查到:

@{ 
    IEnumerable<SelectListItem> secteurSelectList = from x in Model.secteurList select new SelectListItem { 
             Selected = (x.Id == this.GetSessionSecteurId()), 
             Text = x.Secteur, 
             Value = x.Id.ToString() 
            }; 
    SelectList selectList = new SelectList(secteurSelectList, "Value", "Text", secteurSelectList.Where(x => x.Selected==true).FirstOrDefault().Value); } 
    @Html.DropDownListFor(m => m.secteur, selectList) 

这里是我的实体的描述: 在视图模型我用

public List<AuditSecteur> secteurList { get; set; } 

这里AuditSecteur的对象:

public class AuditSecteur 
{ 
    public int Id { get; set; } 
    public string Secteur { get; set; } 
} 

这就是结果:

<select data-val="true" data-val-number="The field Secteur de l'audit must be a number." data-val-required="The Secteur de l'audit field is required." id="secteur" name="secteur"> 
    <option value="1">option1</option> 
    <option value="2">option2</option> 
    <option value="3">option3</option> 
</select> 

SecteurSelectedList具有真正的一个项目选定: one item selected SelectedList太: one item seledted too

感谢帮助我

+0

检查此:http://stackoverflow.com/questions/26777478/selectlist-selected-default-value – 2014-12-04 13:46:29

+0

@EhsanSajjad感谢您的回应,但我不想添加一个元素,但只是预先选择(dynamycally )该用户的项目(为了避免用户将总是(90%的时间)选择相同的)。谢谢 – clement 2014-12-04 14:04:53

回答

1

使用强类型的辅助的整个目的是绑定模型属性,以便在

@Html.DropDownListFor(m => m.secteur, selectList) 

的情况下,如果secteur值不匹配的一个值的选项,那么它不会被选中(实际上是因为它无法找到匹配,因此需要选择第一个选项)。

但是,您的代码还有许多其他问题。首先你创建IEnumerable<SelectListItem>(设置Selected属性是没有意义的,因为它的助手忽略了它),然后根据下一行中的第一个创建另一个IEnumerable<SelectListItem>SelectList)(点是什么?)。生成的选项值基于属性AuditSecteur,但随后绑定到Secteur属性,因此它永远不会回发正确的值。它不是一个真正清楚如何你使用这个(您还没有你的模型,控制器或视图),但正确的做法是像

视图模型

public class SecteurVM 
{ 
    [Display(Name = "Secteur")] 
    [Required] 
    public int? SelectedSecteur { get; set; } 
    public SelectList SecteurList { get; set; } 
} 

控制器

public ActionResult Create() 
{ 
    List<AuditSecteur> secteurList = // get AuditSecteur items from the database 
    SecteurVM model = new SecteurVM(); 
    model.SecteurList = new SelectList(secteurList, "ID", "Secteur"); 
    model.SelectedSecteur = // set the default value you want selected here 
    return View(model) 
} 

[HttpPost] 
public ActionResult Create(SecteurVM model) 
{ 
    // model.SelectedSecteur contains the ID of the selected item 
} 

查看

@model SecteurVM 
.... 
@Html.LabelFor(m => m.SelectedSecteur) 
@Html.DropDownListFor(m => m.SelectedSecteur, Model.SecteurList, "--Please select--") 
@Html.ValidationMessageFor(m => m.SelectedSecteur) 

如果SelectedSecteur的值与列表中项目的ID属性,则显示视图时将选择该选项。

+0

是的,我做了这些错误,因为我已经尝试了很多互联网的例子,我试过所有的事实认为这表明了事实上的缺陷:-)你的方法是最好的,我想在视图中计算selectedIteml,但是在ViewModel毕竟是更好的..谢谢! – clement 2014-12-05 09:26:41

0

要绑定下拉列表,而价值模型的secteur财产下拉菜单的难度为Id,因此下拉菜单在进行预选时不会找到相应的值。

这里即使你已经定义了pre-selected项目它会reset而渲染,所以我建议绑定你下拉到Id而不是secteur

@Html.DropDownListFor(m => m.Id, selectList)