Html.DropDownList选择的值不能使用ViewBag

时间:2013-03-28 15:57:40

标签: asp.net-mvc-3 razor html-select selectedvalue

好吧,经过几个小时阅读这里的东西,尝试所有的解决方案失败,也发现this article,我认为它会挽救我的生命......没有。

长话短说。

这是我的观点(所有组合)

@Html.DropDownList("yearDropDown",(IEnumerable<SelectListItem>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDownxxx",(IEnumerable<SelectListItem>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDown",(<SelectList>)ViewBag.yearDropDown)
@Html.DropDownList("yearDropDown")

这是我的控制器

public ActionResult(int year)
{
var years = new int[] { 2007, 2008, 2009, 2010, 2011, 2012 }
                .Select(x => new SelectListItem { 
                    Text = x.ToString(), 
                    Value = x.ToString(), 
                    Selected=x==year }).Distinct().ToList();

            years.Insert(0, new SelectListItem { Value = null, Text = "ALL YEARS" });
            ViewBag.yearDropDown = new SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault());
return View();
}

这是我呈现的HTML。选择无处可寻。

<select id="yearDropDown" name="yearDropDown"><option value="">ALL YEARS</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
</select>

毋庸置疑,但我会,我在我的Watch中检查并且SelectList实际上具有SelectedValue属性,其中填充了传递给控制器​​的选定年份。但是当我在视图中渲染时,它会转到第一个选项。

请,我需要DropDownList的解决方案,而不是DropDownListFor。我正在强调这一点,因为我看到其他人在这里寻求相同的帮助,一群人给了他们指示,几乎订购它们,使用DropDownListFor。有一个原因我需要使用DropDownList。

解: 看看我自己的答案。 但是,这是我所做的简单修改。

控制器:

ViewBag.yearDropDown = years;

查看:

@Html.DropDownList("yearDropDown")

5 个答案:

答案 0 :(得分:19)

问题也可能是名称,请参见此处。

在控制器

ViewBag.PersonList= new SelectList(db.Person, "Id", "Name", p.PersonId); 

在视图中

@Html.DropDownList("PersonList",(SelectList)ViewBag.PersonList )

这不起作用,你必须更改名称,所以它不一样。

@Html.DropDownList("PersonList123",(SelectList)ViewBag.PersonList )

所以改变yearDropDown它会对你有用。

祝你好运 Christian Lyck。

答案 1 :(得分:2)

ViewBag.yearDropDown = new SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault());

此处的最后一个参数是SelectListItem,但必须选择value(示例中为字符串)

SelectList Constructor (IEnumerable, String, String, Object)

答案 2 :(得分:1)

我知道这是一个老问题,但我会分享另一个解决方案,因为有时候你做了一些正确的事情,但是在请求和响应之后你看不到所选的值,因为你的剃刀可能有bug。在我已经拥有的这种情况下,您可以使用viewbag来选择选项:

在控制器中我有:

 ViewBag.MyData = GetAllData(strSelected);
... 

作为控制器中的私人功能,我有:

  private List<SelectListItem> GetAllData(List<string> selectedData)
    {

        return MyGetAll().Select(x =>
            new SelectListItem
            {
                Text = x.Point,
                Value = x.Amount.ToString(),
                Selected = selectedPrizes.Contains(x.Amount.ToString())
            })
            .ToList();
    }  

在.cshtml中,我有:

<select id="Amount" name="Amount" multiple="multiple">
  @foreach (var listItem in (List<SelectListItem>)ViewBag.MyData)
   {
     <option value="@listItem.Value" @(listItem.Selected ? "selected" : "")>
       @listItem .Text
     </option>
   }
</select>

我希望它对类似的问题有用:)

答案 3 :(得分:0)

将ViewBag属性的名称更改为与DropDownList的名称不匹配。 使用ViewBag.yearDropDownDD代替ViewBag.yearDropDown

另外,您正在错误地创建SelectList。 您需要传递所选值而不是数组项:

ViewBag.yearDropDown = new
SelectList(years, "Value", "Text", years.Where(x => x.Selected).FirstOrDefault().Value);

答案 4 :(得分:-2)

我应该去学习的第一个地方......我没有。

Here is my solution

谢谢你的回答。真的很感激。我觉得现在要自己拍脚了。两个小时阅读博客,我花了2分钟复制这个例子并且工作得很好......