我已将MVC3应用程序转换为MVC5,我不得不将所有视图更改为剃刀。选择列表遇到挑战: 在ASPX视图中,我正在使用以下内容:
<select id="Profession" name="Profession" style="width: 235px; background-color: #FFFFCC;">
<% List<string> allProfessions = ViewBag.AllProfessions;
string selectedProfession;
if (Model != null && !String.IsNullOrEmpty(Model.Profession))
selectedProfession = Model.Profession;
else
selectedProfession = allProfessions[0];
foreach (var aProfession in allProfessions)
{
string selectedTextMark = aProfession == selectedProfession ? " selected=\"selected\"" : String.Empty;
Response.Write(string.Format("<option value=\"{0}\" {1}>{2}</option>", aProfession, selectedTextMark, aProfession));
}%>
</select>
在Razor我正在使用:
<select id="Profession" name="Profession" style="width: 235px; background-color: #FFFFCC;">
@{List<string> allProfessions = ViewBag.AllProfessions;
string selectedProfession;}
@{if (Model != null && !String.IsNullOrEmpty(Model.Profession))
{selectedProfession = Model.Profession;}
else {selectedProfession = allProfessions[0];}
}
@foreach (var aProfession in allProfessions)
{
string selectedTextMark = aProfession == selectedProfession ?
"selected=\"selected\"" : String.Empty;
Response.Write(string.Format("<option value=\"{0}\" {1}>{2}</option>",
aProfession, selectedTextMark, aProfession));
}
</select>
列表显示在页面顶部,我无法弄清楚问题出在哪里。非常感谢您的帮助。
答案 0 :(得分:1)
不要像这样手动创建下拉列表。只需使用:
@Html.DropDownListFor(m => m.Profession, ViewBag.AllProfessions, new { style = "..." })
<强>更新强>
我尝试了你的解决方案但得到了这个错误:扩展方法无法通过动态调度
而且,这就是我鄙视ViewBag
的原因。我道歉,因为我的答案有点泛泛。 Html.DropDownList
要求options参数列表为IEnumerable<SelectListItem>
。由于ViewBag
是动态的,因此无法确定其成员的类型,因此您必须明确强制转换:
(IEnumerable<SelectListItem>)ViewBag.AllProfessions
但是,您的AllProfessions
是一个简单数组,因此在运行时插入值时,强制转换不起作用,但可以通过将其强制转换为List<string>
来轻松修复然后使用Select
转换项目:
((List<string>)ViewBag.AllProfessions).Select(m => new SelectListItem { Value = m, Text = m })
再次,你明白为什么动力学并不那么好,因为语法相当糟糕。你应该处理这类东西的方法是使用你的模型,或者最好是查看模型来做它应该做的事情:保持域逻辑。添加一个属性来保存您的职业选择列表:
public IEnumerable<SelectListItem> ProfessionChoices { get; set; }
然后,在您的控制器操作中,在渲染视图之前填充此列表:
var model = new YourViewModel();
...
model.ProfessionChoices = repository.GetAllProfessions().Select(m => new SelectListItem { Value = m.Name, Text = m.Name });
return View(model);
repository.GetAllProfessions()
是您用作专业列表来源的简写,Name
属性是您获得专业文本价值的简写:您将需要适当改变以符合您的情况。
然后在您看来,您只需要这样做:
@Html.DropDownListFor(m => m.Profession, Model.ProfessionChoices)
鉴于您没有设置此基础架构,对于下拉列表可能看起来很多,这是一个合理的想法。但是,以这种方式工作将使您的视图保持精简,使维护变得更容易,最重要的是,保持所有强类型,以便在出现问题时,您可以在编译时找到而不是运行时。
答案 1 :(得分:0)
我认为这是因为Response.Write
而发生的。试试这个:
@Html.Raw(string.Format("<option value=\"{0}\" {1}>{2}</option>", aProfession,
selectedTextMark, aProfession))