ASP.NET MVC下拉列表未在render上选择值

时间:2013-01-30 13:10:34

标签: asp.net-mvc

我有这个烦人的问题,我的DropDownlist默认情况下不会选择当前值。

控制器:

var YearsCycling = new SelectList(new List<SelectListItem>() 
{ 
    new SelectListItem(){ Value="1yr", Text="1yr"},
    new SelectListItem(){ Value="1-3yrs", Text="1-3yrs"}, 
    new SelectListItem(){ Value="3-5yrs", Text="3-5yrs"}, 
    new SelectListItem(){ Value="5-10yrs", Text="5-10yrs"}, 
    new SelectListItem(){ Value="10+yrs", Text="10+yrs"} 
},
"Value",
"Text",
new SelectListItem() { Value = "5-10yrs", Text = "5-10yrs", 
Selected = true });
ViewBag.YearsCycling = YearsCycling;

查看:

<%:Html.DropDownListFor(model=>model.YearsCycling,(SelectList)ViewBag.YearsCycling,"-select-") %>

但不是选择&#34; 5-10岁&#34;而是显示&#34; -select - &#34;选项,如果我检查DOM源,则没有选择任何元素。

更新:我仍然不知道问题是什么,但我现在通过做一些丑陋的事情让它变得有效:

<%
    var sl = (SelectList)ViewBag.YearsCycling;
%>
<select name="YearsCycling" id="YearsCycling">
<%foreach(var li in sl){  %>
    <option value="<%:li.Value %>" <%if(li.Selected){%>selected="true"<%}%>><%:li.Text %></option>
<%} %>
</select>

这不是最好的解决方案,但是如果你因为你已经把头发拉出来而来到这个问题,这应该会有所帮助。

8 个答案:

答案 0 :(得分:19)

我确定你已经超越了这个,但我刚才被烧毁了,因为我将下拉列表命名为视图模型类中的属性。

将下拉列表名称更改为其他内容即可将其修复。

答案 1 :(得分:7)

试试这个:

创建一个viewmodel:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> YearsCycling { get; set; }
}

控制器:

var YearsCycling = new SelectList(new List<SelectListItem>() 
{ 
    new SelectListItem(){ Value="1yr", Text="1yr"},
    new SelectListItem(){ Value="1-3yrs", Text="1-3yrs"}, 
    new SelectListItem(){ Value="3-5yrs", Text="3-5yrs"}, 
    new SelectListItem(){ Value="5-10yrs", Text="5-10yrs"}, 
    new SelectListItem(){ Value="10+yrs", Text="10+yrs"} 
},
"Value",
"Text");

MyViewModel model = new MyViewModel();
model.YearsCycling = YearsCycling;
model.SelectedValue = "5-10yrs";
return View(model);

查看:

<%:Html.DropDownListFor(model=>model.SelectedValue,(SelectList)Model.YearsCycling) %>

答案 2 :(得分:5)

如果您按照以下方式呈现列表:@Html.DropDownListFor(model => model.EntityID, Model.EntitySelectList)

.NET MVC在渲染选择选项时将使用的值将与model.EntityID.ToString()的值匹配。

...它不会选择Model.EntitySelectList.SelectedValue

...或任何EntitySelectList.Item.SelectedValue项。

...换句话说,当渲染DropDownListFor list本身以外的东西时, List List Items <的SelectedValue属性/ strong>被忽略。

无论设置什么Model.EntitySelectList.SelectedValue或Model.EntitySelectList.Item.SelectedValue,ASP.NET MVC都不会呈现选择。请改用model.EntityID

答案 3 :(得分:3)

你的代码应该是。

var YearsCycling = new List<SelectListItem>() 
{ 
    new SelectListItem(){ Value="1yr", Text="1yr"},
    new SelectListItem(){ Value="1-3yrs", Text="1-3yrs"}, 
    new SelectListItem(){ Value="3-5yrs", Text="3-5yrs"}, 
    new SelectListItem(){ Value="5-10yrs", Text="5-10yrs", Selected=true}, 
    new SelectListItem(){ Value="10+yrs", Text="10+yrs"} 
};

ViewBag.YearsCycling = YearsCycling;

您可以使用此重载。

<%:Html.DropDownListFor(model=>model.YearsCycling,ViewBag.YearsCycling as List<SelectListItem>) %>

答案 4 :(得分:2)

绑定下拉列表在MVC中非常棘手,它使我很尴尬 您可以在控制器中使用此功能将所有城市列表放入viewBag

创建

      ViewBag.CityId = new SelectList(db.Cities, "ID", "Name");

user.CityID如果您在编辑中,那么在编辑时选择城市

      ViewBag.CityId = new SelectList(db.Cities, "ID", "Name", user.CityID);
在你的视图中

只是做这个技巧

     @Html.DropDownList("CityId", "Select")

这是我所知道的最简单的方式......

答案 5 :(得分:1)

使用与html-element同名的ViewBag时遇到一些问题。

因此,当SelectList存储在ViewBag.EventId中时,不会对EventId使用DropDownList。

将ViewBag.EventId更改为ViewBag.EventData,并且已修复。

答案 6 :(得分:1)

确保ViewBag上设置的变量名称与分配给下拉列表的名称不同 - 即不要这样做:

控制器:

ViewBag.CityId = new SelectList(....)

查看:

@ Html.DropDownList(“CityId”,...

只需使用不同的viewbag变量名称。

当使用相同的ViewBag变量名作为带有下拉列表和列表框的html控件名称时,我遇到了问题。

答案 7 :(得分:1)

Html.DropDownListFor也使用 POST请求中的值。

因此,如果POST数据中有相同的参数,即使模型中的值不同,MVC也会使用它。

检查请求中是否有相同的名称并进行更改。