14

我已经阅读了这个问题ASP.NET MVC DropDownListFor not selection value from model and answer,但我不知道我的问题的解决方案。

这是我的看法:

@foreach (var adjusterLanguages in Model.adjusterLanguages)
{
    <div class="editor-field row">
        @Html.DropDownListFor(model => Model.adjusterLanguages[i].languageID,
                              (SelectList)ViewBag.ForeignLanguages) 
        @Html.ValidationMessageFor(model =>Model.adjusterLanguages[i].languageID)
    </div>

    <div style="clear: left;"></div>

    i++;
}

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

model.adjusterLanguages = adjLangs;

那么,当模型被发送到视图时,我怎样才能让它选择项目呢?

生成的html如下:

<div class="editor-field row">
    <select id="adjusterLanguages_0__languageID" name="adjusterLanguages[0].languageID"><option value="">--Select--
        </option>
        <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option>
        <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option>
        <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option>
        <!-- ... truncated for brevity ... -->
    </select> 
    <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[0].languageID" data-valmsg-replace="true"></span>
</div>
<div style="clear: left;"></div>
<div class="editor-field row">
     <select id="adjusterLanguages_1__languageID" name="adjusterLanguages[1].languageID">
          <option value="">--Select--</option>
          <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option>
          <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option>
          <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option>
          <!-- ... truncated for brevity ... -->
     </select> 
     <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[1].languageID" data-valmsg-replace="true"></span>
</div>
4

6 回答 6

36

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

@Html.DropDownListFor(
   model => Model.adjusterLanguages[i].languageID, 
   new SelectList(
       ViewBag.ForeignLanguages, "Value", "Text", 
       @Model.adjusterLanguages[i].languageID)) 
于 2013-05-28T19:29:06.293 回答
4

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

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

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

编辑:

我喜欢这个模型:

public class AdjusterLanguageModel
{
  public Guid LanguageId { get; set; }
  List<SelectListItem> ForeignLanguages{ get; set; }
}

public class AdjusterListModel
{
  public List<AdjusterLanguageModel> AdjusterLanguages { get; set }
}

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

在您看来:

@foreach (var adjusterLanguages in Model.AdjusterLanguages)
{
    <div class="editor-field row">
        @Html.DropDownListFor(model => adjusterLanguages[i].LanguageID,
          adjusterLanguages[i].ForeignLanguages) 
        @Html.ValidationMessageFor(model => adjusterLanguages[i].LanguageID)
    </div>

    <div style="clear: left;"></div>

    i++;
}

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

于 2013-05-28T19:24:17.163 回答
1

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

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

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

于 2013-05-28T19:22:16.293 回答
1

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

于 2015-12-22T20:12:44.650 回答
0

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

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

用法是:

selectList = selectList.SelectValue(someValue);
于 2017-05-23T10:56:18.670 回答
0

我在 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" })
于 2017-08-09T22:18:46.760 回答