首页 文章

MVC DropDownList不从模型中选择值

提问于
浏览
13

我已经阅读了这个问题ASP.NET MVC DropDownListFor not selecting value from model并回答但我不知道我的问题的解决方案 .

这是我的看法:

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

6 回答

  • 0

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

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

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

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

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

    Edit:

    我喜欢这个型号:

    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 获得's it'自己的语言列表 .

  • 1

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

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

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

  • 30

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

  • 1

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

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

    用法是:

    selectList = selectList.SelectValue(someValue);
    
  • 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" })
    

相关问题