日期:2014-05-17  浏览次数:20412 次

mvc2 DropDownListFor 不能选中绑定的值
Model:
public class EditUserViewModel{
    public User user;
    public IList<SelectListItem> RoleList = new List<SelectListItem>()
    {
        new SelectListItem(){Value="", Text="请选择"},
        new SelectListItem(){Value="管理员", Text="管理员"},
        new SelectListItem(){Value="用户", Text="用户"}
    }
}
Controller:
     EditUserViewModel m = new EditUserViewModel();
    m.user = GetUser(); //user的Role是"用户"
    return View(m);
View:
    (正常写法)<%:Html.DropDownListFor(m => m.User.Role, Model.RoleList)%>

View里的DropDownListFor下拉列表里面有值,但选中的一直都是“请选择”,没有选中“用户”

解决办法:
    <%:Html.DropDownListFor(m => m.User.Role, new SelectList(Model.RoleList, "Value", "Text", Model.User==null?string.Empty:Model.User.Role))%>

问题:此解决办法应该属于偏方吧,为什么正常写法不好用,求解答。
------最佳解决方案--------------------
 m.user = GetUser(); //user的Role是"用户"

我就没看到你有代码去设置了 下拉菜单中的选中项
这个GetUser()方法只是获取了用户信息吧,你在什么地方根据用户信息设置了下拉菜单的“选中”呢

换言之,最终的 <select></select> 中的<option></option> 是需要一个 selected 来表示其处于选中状态的,楼主设置了没?
------其他解决方案--------------------
(正常写法)<%:Html.DropDownListFor(m => m.User.Role, Model.RoleList)%>

这里只是给一个name为Role的select 加载了一堆option而已,并未指定哪个option处于选中状态
------其他解决方案--------------------
控制器里,生成selectlist 的时候可以设定selectedValue
------其他解决方案--------------------
你确认你的Value值是中文描述而不是数字标识?
m.User.Role =""? 管理员? 用户? ??
------其他解决方案--------------------
确认,查看源文件就可看到<option value="用户">用户<option>
------其他解决方案--------------------
我的意思,你的m.User.Role值也是中文么??
------其他解决方案--------------------
确认,查看源文件就可看到<option value="用户">用户<option>
------其他解决方案--------------------
问题应该和是不是中文没关系,要不然解决方法也不起做用,现在改用mvc4了,还不知道好用不,继续求解。
------其他解决方案--------------------
mvc4也不好用,难道真的只能用偏方,继续求解。
------其他解决方案--------------------
personball说的确实是这么回事,我觉得应该自己就根据m => m.User.Role选中了 
我又找着一个偏方写法比上面的偏方要优雅,但是在model里还是要写一大堆的东西。
personball能给出个正规的解决方法吗?
还有的说是多个类型合并到一个类型后才这样,那往model传多个类型应该怎么处理呢,比如首页,继续求解。
------其他解决方案--------------------
我是新手,理解起来可能的点慢,现在明白RoleList只是做为数据源,DropDownList构造的时候还要有一步从RoleList里取数据RoleList.Select(c => new SelectListItem { Text = c.Text, Value = c.Value, Selected = c.Value == 这个地方就是Model里的值 }),不知这样算不算正规写法,求解答。

PS:MVC用起来还是很舒服的,拉姆达表达式理解起来还是很困难的。