关于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>


由于某些原因,任何选项上都没有选定的属性,因此选择了第一个选项。

任何帮助表示赞赏。



更新

看来这与article有关。总结本文的解决方案,我需要确保属性名称(@html.DropDownList的第一个参数)与模型的任何现有属性都不匹配。有人可以解释为什么会这样吗?

当我在视图中编写如下内容时,它会正确地下拉列表:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions)


但是,这样做没有任何逻辑意义,因为我实际上希望活页夹能够将select元素的名称与model属性匹配。否则,我将不得不像这样手动获取值:Request.Form["PermissionIdNotMatching"];

有人有什么想法吗?





查看已接受的答案和对此的第一条评论。

最佳答案

好的,让我们讨论一下PermissionId为int时的示例。您发布了类型为CreateEditAccountModel的模型以进行查看。创建此模型时,PermissionId等于0(int的默认值)。并且DropDownListFor在视图中获得此值。因此,您没有选定的值。
当您使用字符串类型时,PermissionId的默认值为null,因此`DropDownListFor将采用SelectList的默认值。

在这种情况下,最好对int?使用Nullable<int>PermissionId类型。

关于asp.net-mvc-3 - DropDownListFor-不选择“选定”值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9832905/

10-13 01:50