MVC DropDownList不从模型中选择值

我已经阅读了这个问题ASP.NET MVC DropDownList没有从模型和答案中选择值,但我不知道我的问题的解决方案。

这是我的看法:

@foreach (var adjusterLanguages in Model.adjusterLanguages) { 
@Html.DropDownListFor(model => Model.adjusterLanguages[i].languageID, (SelectList)ViewBag.ForeignLanguages) @Html.ValidationMessageFor(model =>Model.adjusterLanguages[i].languageID)
i++; }

我可以确认正在填充模型数据(来自我的控制器):

 model.adjusterLanguages = adjLangs; 

那么,如何在模型发送到视图时选择项目?

生成的html如下:

 
--Select-- Afrikanns Albanian Arabic
--Select-- Afrikanns Albanian Arabic

我找到了答案! 感谢大家的帮助。 当我将代码更改为以下代码时,它可以正常工作。 代码只是指定选定的值:

 @Html.DropDownListFor( model => Model.adjusterLanguages[i].languageID, new SelectList( ViewBag.ForeignLanguages, "Value", "Text", @Model.adjusterLanguages[i].languageID)) 

当您在控制器中填充ViewBag.ForeignLanguages时,在应该选择的项目上,将.Selected属性设置为true。

但是,您将遇到此问题,因为您有许多项目使用相同的ForeignLangauges项目列表。

您需要为列表中的每个adjusterLanguages创建一个列表。 他们不能共享相同的列表,因为adjusterLanguages[0]需要选择不同的项目而不是adjusterLanaguages[1]

编辑:

我喜欢这个型号:

 public class AdjusterLanguageModel { public Guid LanguageId { get; set; } List ForeignLanguages{ get; set; } } public class AdjusterListModel { public List AdjusterLanguages { get; set } } 

在控制器中,您使用ID和它自己的可用语言列表填充列表。

在你看来:

 @foreach (var adjusterLanguages in Model.AdjusterLanguages) { 
@Html.DropDownListFor(model => adjusterLanguages[i].LanguageID, adjusterLanguages[i].ForeignLanguages) @Html.ValidationMessageFor(model => adjusterLanguages[i].LanguageID)
i++; }

所以每个DropDownListFor得到它自己的语言列表。

在我看来, ViewBag.ForeignLanguages一个项目应该将Selected属性设置为true 。 DropDownListFor方法根据ModelState选择项目。 这里有DropDownListFor方法的源代码,有类似的东西:

 object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); 

如果该值为null,则从Selected属性中检索选定的值

我知道这是一个老问题,但万一有人面临与我相同的问题。 在我的情况下,我不小心使用了普通变量而不是模型中的属性,只要我将其设置为属性而不是它开始工作。

我添加了一个扩展方法来强制执行值选择。 它还在页面重新加载时保留视图状态数据。

 public static class SelectListExtensions { public static SelectList SelectValue(this SelectList selectList, object value) { return new SelectList(selectList, "Value", "Text", value); } } 

用法是:

 selectList = selectList.SelectValue(someValue); 

我在SList而不是ViewBag中发送IEnumerable

 @Html.DropDownListFor(model => Model.list[i].Id, new SelectList(Model.SList, "Value", "Text", Model.list[i].Id), htmlAttributes: new { @class = "form-control" })