如何在DropDownListFor Html helper中设置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。
#1 楼
当您使用DropDownListFor()
(或DropDownList()
)方法绑定到模型属性时,该属性的值将设置所选选项。内部,这些方法会生成自己的
IEnumerable<SelectListItem>
并设置Selected
属性基于属性的值,因此在代码中设置Selected
属性将被忽略。仅当您不绑定到模型属性时(例如使用@Html.DropDownList("NotAModelProperty", new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2))
),才可以使用它,请注意,您可以检查源代码,尤其是
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" })
评论
这让我开始思考...我可以以某种方式扩展SelectList / SelectListItem以便更轻松地插入数据属性吗?
–迪诺
17年1月19日在9:12
不,除非您重写源代码中的所有代码以创建自己的扩展方法以及SelectListItem和SelectList类(还有更多),否则不行。为什么您认为需要data- *属性?使用一些javascript会容易得多。
–user3559349
17年1月19日在9:16
好吧,有时候我需要在价格,积分或名称等选项中具有其他值,所以我选择了select而不是html.helper,但是我需要手动应用data-val- *属性来选择,这就是我认为这可能的原因拥有一些更清洁,更有效的方式来处理所有这些问题。
–迪诺
17年1月19日在9:33
如果您在视图中需要这些值,那么无论如何您都必须使用javascript(否则它们不应存在)。您可以将包含这些值的集合(作为模型的属性)传递给视图,将其分配给javascript数组,然后处理
#2 楼
确保您的返回选择值是一个String而不是String,并且在模型中声明时为int。示例:
public class MyModel
{
public string TipPopustaId { get; set; }
}
#3 楼
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使用任何其他列表,然后选择Listtype属性的键和值>
#4 楼
我注意到没有面向剃刀的方法,我在下面添加了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)
评论
DropDownListFor()基于属性TipPopustaId的值(即模型绑定的工作方式)设置所选选项。在将模型传递到视图之前,请在控制器中设置其值,然后将选择正确的选项(绑定到模型属性时将忽略Selected属性的设置)我是新来的,但仍在尝试愚蠢的事情。非常感谢您提醒我。
确定,当我看到它时将其作为答案。
您确定列表中2作为ID存在吗?
第一条评论是正确的答案。当使用TipPopustaId作为绑定名称进行模型绑定时,无论我如何编写(错误与否),都会忽略“ selectedValue”。所以我所有的尝试都是错误的。我只需要从控制器传递正确的值即可。