在MVC4中的DropDownListFor()上没有设置选定值

本文关键字:设置 中的 MVC4 DropDownListFor | 更新日期: 2023-09-27 18:09:30

这个问题似乎被问了太多次了。但这简直要把我逼疯了。

这是我的(简化的)模型。
public class UserEditModel
{
    [Required]
    public string Title { get; set; }
    private IEnumerable<SelectListItem> _titleList;
    public IEnumerable<SelectListItem> TitleList
    {
        get { return _titleList.Select(x => new SelectListItem {
                            Selected = (x.Value == Title), 
                            Text = x.Text,
                            Value = x.Value
                        });
        }
        set { _titleList = value; }
    }
}

TitleList成员中每个SelectListItemTextValue性质相同。例如:

new SelectListItem { Text = "Mr", Value = "Mr"  }

当下面的代码被发布时,正确的Title值被绑定到模型上,但是当模型响应POST或GET被推送到视图时,所选择的值不会在下拉列表上设置,即使所有的智能感知显示正确的值都存在。

@Html.DropDownListFor(x => x.Title, Model.TitleList)

我已经根据几篇文章和几个SO答案确保代码是正确的,所以我被难住了。

有什么建议吗?

更新:

为完整起见,这是操作和支持方法:

[HttpGet]
public ActionResult Edit(int id)
{
    var user = _userService.Get(id);
    var model = new UserEditModel()
    {
        ...
        Title = user.Title,
        TitleList = ListTitles()
    };
    return View(model);
}
private IEnumerable<SelectListItem> ListTitles()
{
    var items = new[] {
            new SelectListItem() {Text = "Mr", Value = "Mr" },
            new SelectListItem() {Text = "Mrs", Value = "Mrs"},
            new SelectListItem() {Text = "Ms", Value = "Ms"},
            new SelectListItem() {Text = "Miss", Value = "Miss"},
            new SelectListItem() {Text = "Professor", Value = "Professor"},
            new SelectListItem() {Text = "Dr", Value = "Dr" }
        };
    return items;
}

如您所见,没有什么花哨的,只是一个简单的实现。

在MVC4中的DropDownListFor()上没有设置选定值

您需要添加ModelState.Clear(),因为默认情况下,当从post操作返回视图时,它认为它已经验证失败,因此使用ModelState中的值而不是中的值。许多人认为这实际上是MVC中的一个错误,但这是设计的:

ASP。. NET MVC假定,如果您正在渲染视图以响应HttpPost,并且您正在使用Html helper,那么您很可能会重新显示验证失败的表单。因此,在查看Model之前,Html helper实际上会先检查ModelState中要在字段中显示的值。这使它们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。

链接

嗯,似乎代码实际上没有什么问题,只是模型中Title属性的名称。

看起来Title是一个保留字,用TitleX或更合适的Salutation替换它可以使一切正常

您确定在控制器中正确检索了selectlist项吗?对我来说,它工作得很好。我会使用get方法而不是属性(GetTitleList(string value)),以避免在代码中获得选择列表时出现错误。