3

好像这个问题被问过太多次了。但这让我发疯。

这是我的(简化的)模型。

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; }
    }
}

成员中每个的TextValue属性是相同的。例如:SelectListItemTitleList

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;
}

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

4

3 回答 3

2

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

ASP.NET MVC 假定,如果您正在呈现一个 View 以响应 a HttpPost,并且您正在使用 Html Helpers,那么您很可能会重新显示一个验证失败的表单。因此,Html 助手在ModelState查看模型之前实际上会检查要在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。

关联

于 2013-04-17T08:27:20.410 回答
2

好吧,看起来代码实际上并没有什么问题,只是Title模型中的属性名称。

它看起来像是Title一个保留字,将其替换为TitleX或更恰当地Salutation使一切正常。

于 2013-04-17T08:57:01.387 回答
0

您确定您在控制器中适当地检索了选择列表项吗?对我来说,它工作正常。我将使用 get 方法而不是属性 ( GetTitleList(string value)),以避免在代码中进一步获取选择列表时出错。

于 2013-04-17T08:32:18.410 回答