我有以下ViewModel
public class ContactAddViewModel
{
string _title;
public ContactAddViewModel()
{
var titles = new List<SelectListItem>()
{
new SelectListItem() { Value = "Mr", Text= "Mr" },
new SelectListItem() { Value= "Miss", Text="Miss" },
new SelectListItem() { Value = "Mrs", Text= "Mrs" },
new SelectListItem() { Value = "Ms", Text = "Ms" },
new SelectListItem() { Value = "Dr", Text = "Dr" }
};
Titles = titles;
}
[Required]
[Display(Name = "Title")]
public string Title { get; set; }
public IEnumerable<SelectListItem> Titles { get; set; }
...
在控制器中调用:
var ctc = new ContactAddViewModel()
{
Title = contact.Title.Trim()
};
return View(ctc);
然后在视图中:
<div class="form-group col-md-2">
@Html.LabelFor(m => m.Title)
@Html.DropDownListFor(m => m.Title, Model.Titles, string.Empty, new { @class = "form-control placeholder-no-fix" })
@Html.ValidationMessageFor(m => m.Title, "", new { @class = "help-block" })
</div>
但是没有选择任何选项。我已经确认标题是正确的,我甚至尝试过手动设置:
[Required]
[Display(Name = "Title")]
public string Title
{
get { return _title; }
set
{
_title = value;
foreach(var t in Titles)
{
if(t.Value == _title)
{
t.Selected = true;
}
}
}
}
在视图中进行调试时,正确的SelectListItem
将Selected
属性设置为true,但在最终标记中未选中它。
我哪里错了? - 我有正确绑定的模型中的其他下拉列表(如果有任何差异,则有数值)。
答案 0 :(得分:6)
这会让你想要把头伸到墙上。您是否恰巧使用ViewBag.Title
在视图中设置页面标题?这很常见。
嗯,首先需要了解的是,设置Selected
的{{1}}属性会在MVC中执行绝对 jack all 。剃刀会根据SelectListItem
自动选择要标记为选中的项目,并覆盖您手动设置为所选内容的任何内容。
ModelState
由ModelState
,Request
/ ViewData
和最终 ViewBag
的值组成。无论长短,如果您在Model
中有密钥,或者对您的问题很重要,Request
成员与您的财产同名,那么 值将是为生成的HTML Razor设置值。我想象ViewBag
与ViewBag.Title
枚举中的任何内容都不匹配,这就是为什么它未被设置。您需要将此属性命名为其他内容,或将Titles
更改为ViewBag.Title
之类的内容。