2013-05-28 65 views
14

我已通读此问题ASP.NET MVC DropDownListFor not selecting value from model并回答但我不知道解决方案是否存在问题。MVC DropDownListFor未从模型中选择值

这是我的看法:

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

是从上面的代码产生什么HTML? –

+0

@MattHouser好问题;请参阅我的编辑。 – user1477388

+0

您的任何'

回答

29

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

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

我喜欢这个解决方案。 –

+0

@MattHouser谢谢! – user1477388

+0

感谢您的解决方案。我不明白为什么它不会选择正确的值,也许它不应该?奇怪... – Luke

1

在我的ViewBag.ForeignLanguages的意见一个项目应该有Selected属性设置为true。 DropDownListFor方法根据ModelState选择项目。 Here你有DropDownListFor方法的源代码的存在是一样的东西:

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

如果该值是null,则选择值从Selected财产

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得到的它自己的语言列表。

+0

但是,选定的项目值已经在模型中。不应该MVC简单地从列表中选择项目?是否有重写使它可以这样做? – user1477388

+0

它应该,但它不是。重写是让你在控制器中设置'.Selected'属性为true。 –

+0

谢谢,马特。请看我刚刚找到的答案。这是确定默认选定值的覆盖。 http://stackoverflow.com/a/16799915/1477388 – user1477388

1

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

+0

我知道的更好!但这正是发生的事情。这是一种单向模式(没有传统的回发),我碰巧修改了一个选择列表。感谢您的提醒! –

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); 
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" }) 
相关问题