【问题标题】:MVC5 - How to set "selectedValue" in DropDownListFor Html helperMVC5 - 如何在 DropDownListFor Html 助手中设置“selectedValue”
【发布时间】:2017-06-02 19:46:42
【问题描述】:

正如问题所说: 如何在 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。

【问题讨论】:

  • DropDownListFor() 根据属性 TipPopustaId 的值设置选定的选项(即模型绑定的工作方式)。在将模型传递给视图之前在控制器中设置其值,然后将选择正确的选项(绑定到模型属性时忽略设置Selected 属性)
  • 我是新的,但仍在尝试愚蠢的事情。非常感谢您提醒我。
  • 好的,我会在看到它时将其作为答案进行检查。
  • 您确定 2 作为 ID 存在于您的列表中吗?
  • 第一个评论是正确的答案。在使用 TipPopustaId 作为绑定名称的模型绑定时,无论我如何编写它(错误与否),都会忽略“selectedValue”。所以我所有的尝试都是不正确的。我只需要从控制器传递正确的值就可以了。

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


【解决方案1】:

当您使用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" })

【讨论】:

  • 这让我开始思考......我能否以某种方式扩展 SelectList/SelectListItem 以更轻松地插入数据属性?
  • 不,除非您重写源代码中的所有代码以创建自己的扩展方法,以及 SelectListItemSelectList 类(还有更多)。为什么你认为你需要data-* 属性?使用一点javascript会容易得多。
  • 嗯,有时我需要在价格、积分或名称等选项中设置其他值,所以我使用 select 而不是 html.helper 但我需要手动应用 data-val-* 属性来选择这就是为什么我认为有可能有一些更清洁、更有效的方式来处理所有这些问题。
  • 如果您在视图中需要这些值,那么无论如何您都必须使用 javascript(否则它们不应该存在)。您可以将包含这些值的集合(作为模型的属性)传递给视图,将其分配给 javascript 数组,然后处理 <select> 的更改事件以检索相关的附加属性
  • 是的,我大部分时间都在这样做,除了我不喜欢它的大小不断增长的事实,因为所有事件处理、字段间计算、输入过滤、jQuery ajax 处理程序什么不是。我还没有在 java 脚本中想出“命名空间”来实现干净的分离,因为现在它看起来像 mumbo jumbo,我讨厌它。 :(
【解决方案2】:

当你在模型中声明它时,确保你的返回选择值是一个字符串而不是整数。

例子:

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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多