【发布时间】:2012-03-23 01:13:18
【问题描述】:
关于DropDownListFor 未选择“Selected” 值的另一个问题。
这是代码:
型号:
public class CreateEditAccountModel
{
[Required]
[Display(Name = "Permission")]
public int PermissionId { get; set; }
public IEnumerable<SelectListItem> Permissions { get; set; }
}
控制器:
[HttpGet]
[Authorize]
public ActionResult EditAccount(int id)
{
CreateEditAccountModel model = new CreateEditAccountModel();
model.Permissions = PermissionsAll();
return View("CreateEditAccount", model);
}
此时,如果我在返回行上设置断点,model.Permissions 包含正确的 IEnumerable<SelectListItem> 对象,其中包含多个项目且只有一个具有 Selected = true。
查看:
@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.PermissionId, Model.Permissions)
}
渲染:
<select id="PermissionId" name="PermissionId">
<option value="">-- Select --</option>
<option value="1">Permission one</option>
<option value="2">Permission two</option>
</select>
由于某种原因,任何选项都没有 selected 属性,因此选择了第一个选项。
感谢任何帮助。
更新
看来这与article 有关。总结本文的解决方案,我需要确保属性名称(@html.DropDownList 的第一个参数)不与模型的任何现有属性匹配。 谁能解释为什么会这样?
当我在视图中这样写时,它会正确呈现下拉:
@Html.DropDownList("PermissionIdNotMatching", Model.Permissions)
但是,这样做没有任何逻辑意义,因为我实际上希望 binder 能够将 select 元素的名称与模型属性匹配。否则我必须手动获取这样的值:Request.Form["PermissionIdNotMatching"];
有人有什么想法吗?
解决方案
查看接受的答案和对其的第一条评论。
【问题讨论】:
-
PermissionId 的值应该等于 Selected = true 的 SelectListItem.Value。尝试 model.PermissionId = Convert.ToInt32(lst.First(t => t.Selected).Value);我也遇到了与您相同的问题,令人惊讶的是,在编辑时选择了该值,从那里我认为 PermissionId 应该具有与所选 SelectListItem 的值相同的值。为我工作。
标签: asp.net-mvc-3 html.dropdownlistfor