Aspx到Razor选择列表MVC5

时间:2013-12-31 21:04:12

标签: asp.net-mvc select razor

我已将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>

列表显示在页面顶部,我无法弄清楚问题出在哪里。非常感谢您的帮助。

2 个答案:

答案 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))