MVC5 - 如何设置" selectedValue"在DropDownListFor Html帮助器中

时间:2017-01-18 12:21:22

标签: asp.net-mvc asp.net-mvc-5 html-helper

正如问题所说: 如何在DropDownListFor Html帮助器中设置selectedValue?

尝试了大多数其他解决方案,但没有一个能解决我开启新问题的原因。

这些都没有帮助:

@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2), htmlAttributes: new { @class = "form-control" })

//Not working with or without cast
@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Single(x => x.Id == 2)), htmlAttributes: new { @class = "form-control" })
@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Where(x => x.Id == 2).FirstOrDefault()), htmlAttributes: new { @class = "form-control" })

@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", new SelectListItem() { Value="2", Selected=true}), htmlAttributes: new { @class = "form-control" })

如果可能的话,我想避免仅为列表手动创建SelectListItems或ViewModel。

4 个答案:

答案 0 :(得分:17)

使用DropDownListFor()(或DropDownList())方法绑定到模型属性时,它是设置所选选项的属性值。

在内部,这些方法会生成自己的IEnumerable<SelectListItem>并根据属性的值设置Selected属性,因此会忽略在代码中设置Selected属性。它唯一被尊重的时候是你没有绑定到模型属性,例如使用

@Html.DropDownList("NotAModelProperty", new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2))

请注意,您可以检查source code,特别是SelectInternal()GetSelectListWithDefaultValue()方法,了解其工作原理。

要在首次渲染视图时显示所选选项,请在将模型传递给视图之前在GET方法中设置属性的值

我还建议您的视图模型包含属性IEnumerable<SelectListItem> TipoviDepozita,并在控制器中生成SelectList

var model = new YourModel()
{
    TipoviDepozita = new SelectList(yourCollection, "Id", "Naziv"),
    TipPopustaId = 2 // set the selected option
}
return View(model);

所以视图变为

@Html.DropDownListFor(m => m.TipPopustaId, Model.TipoviDepozita, new { @class = "form-control" })

答案 1 :(得分:1)

确保在模型中声明返回的选择值是一个字符串,而不是和int。

示例:

public class MyModel
{
    public string TipPopustaId { get; set; }
}

答案 2 :(得分:0)

public static class EnumHelper
{
    public static SelectList EnumToSelectList<TEnum>(this Type enumType, object selectedValue)
    {  
        return new SelectList(Enum.GetValues(enumType).Cast<TEnum>().ToList().ToDictionary(n=> n), "Key", "Value", selectedValue);
    }
}

在您的视图中:

@Html.DropDownListFor(model => model.Role, EnumHelper.EnumToSelectList<Role>(typeof(Role), Model.Role),  new { htmlAttributes = new { @class = "padding_right" } })
@Html.ValidationMessageFor(model => model.Role, "", new { @class = "text-danger" })

代替EnumToList使用任何其他列表,然后选择列表类型属性的键和值

答案 3 :(得分:0)

我注意到下面没有添加剃须刀的方法

var prices = from P in Model[idx].prices.Values
             where !P.Key.ToLower().Contains("san")
             select new SelectListItem()
             {
                 Text = P.Key + " Month " + (Convert.ToDecimal(P.Value) + ((Convert.ToDecimal(P.Value) / 100) * 20)).ToString("0.##") + " $",
                 Value = P.Key
             };
prices.ToList()[0].Selected = true;
@Html.DropDownListFor(model => prices.ToList()[0], prices)