Asp.net mvc Aspx到Razor选择列表MVC5

Asp.net mvc Aspx到Razor选择列表MVC5,asp.net-mvc,select,razor,Asp.net Mvc,Select,Razor,我已将我的MVC3应用程序转换为MVC5,我必须将所有视图更改为razor。通过选择列表进行挑战: 在有效的ASPX视图中,我使用以下内容: <select id="Profession" name="Profession" style="width: 235px; background-color: #FFFFCC;"> <% List<string> allProfessions = ViewBag.AllProfessions; string selected

我已将我的MVC3应用程序转换为MVC5,我必须将所有视图更改为razor。通过选择列表进行挑战: 在有效的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>

在我使用的剃须刀中:

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

@{List allProfessions=ViewBag.allProfessions;
字符串selectedProfession;}
@{if(Model!=null&&!String.IsNullOrEmpty(Model.Profession))
{selectedProfession=Model.Profession;}
else{selectedProfession=allProfessions[0];}
}
@foreach(所有行业的var平均值)
{
字符串selectedTextMark=aProfession==selectedProfession?
“selected=\“selected\”:String.Empty;
Response.Write(string.Format(“{2}”),
aProfession,selectedTextMark,aProfession));
}

列表显示在页面顶部,我不知道问题出在哪里。非常感谢您的帮助。

不要那样手动创建下拉列表。只需使用:

@Html.DropDownListFor(m => m.Profession, ViewBag.AllProfessions, new { style = "..." })
更新


我尝试了您的解决方案,但出现了以下错误:无法动态调度扩展方法

这就是为什么我鄙视
ViewBag
。我道歉,因为我的回答有点笼统
Html.DropDownList
要求选项列表参数为
IEnumerable
。由于
ViewBag
是动态的,因此无法确定其成员的类型,因此必须显式强制转换:

(IEnumerable<SelectListItem>)ViewBag.AllProfessions
在这里,您再次看到了为什么动力学没有那么好,因为语法相当糟糕。处理这类内容的方法应该是使用您的模型,或者最好是视图模型来完成它应该做的事情:保留域逻辑。添加属性以保存您的职业选择列表:

public IEnumerable<SelectListItem> ProfessionChoices { get; set; }
repository.GetAllProfessions()
是作为职业列表来源的任何内容的简写,而
Name
属性是如何获取职业文本值的简写:您需要适当地更改它以匹配您的场景

那么在你看来,你只需要做:

@Html.DropDownListFor(m => m.Profession, Model.ProfessionChoices)

考虑到您还没有建立这个基础设施,仅仅为了一个下拉列表,可能需要做很多事情,这是一个合理的想法。然而,以这种方式工作将使您的视图保持精简,使维护更容易,最重要的是,将所有内容都保持强类型,以便在编译时而不是运行时发现问题。

我相信这是因为
响应。编写
。试试这个:

 @Html.Raw(string.Format("<option value=\"{0}\" {1}>{2}</option>", aProfession,
           selectedTextMark, aProfession))
@Html.Raw(string.Format(“{2}”),一个函数,
已选择的文本标记,一个段落)

我尝试了您的解决方案,但出现了以下错误:扩展方法无法动态调度。非常感谢Chris花时间提供帮助。
@Html.DropDownListFor(m => m.Profession, Model.ProfessionChoices)
 @Html.Raw(string.Format("<option value=\"{0}\" {1}>{2}</option>", aProfession,
           selectedTextMark, aProfession))