【问题标题】:Strange behavior in helper method DropDownListFor辅助方法 DropDownListFor 中的奇怪行为
【发布时间】:2012-06-13 06:20:10
【问题描述】:

我在DropDownListFor 中看到了一件奇怪的事情。这是我的观点的一部分:

1:<dt>
2:  @Html.LabelFor(model => model.MainModel.DefaultAreaId)
3:</dt>
4:<dd>
5: @Html.DropDownListFor(model => model.MainModel.DefaultAreaId, Model.FKs["DefaultAreaId"].Items, new { @class = "Areadd" })
6: @Html.ValidationMessageFor(model => model.MainModel.DefaultAreaId, null, new { @class = "invalid-side-note" })
7:</dd>

我签入调试我的控制器的最后一行:return View(model);Model.FKs["DefaultAreaId"].Items 的值是:

 0: {Title="t1", value=13, Selected = false},
 1: {Title="t2", value=15, Selected = false},
 2: {Title="t3", value=17, Selected = false},
 3: {Title="t4", value=16, Selected = true}

我也检查了上面视图的第 2 行,值是一样的,但是在第 5 行之后 DropDownListFor 值更改为:

 0: {Title="t1", value=13, Selected = false},
 1: {Title="t2", value=15, Selected = false},
 2: {Title="t3", value=17, Selected = false},
 3: {Title="t4", value=16, Selected = false}

我无法理解 DropDownListFor 和我的模型值会发生什么?我也在同一个视图中使用相同的方式:

11:<dt>
12:  @Html.LabelFor(model => model.MainModel.DefaultControllerId)
13:</dt>
14:<dd>
15: @Html.DropDownListFor(model => model.MainModel.DefaultControllerId, Model.FKs["DefaultControllerId"].Items, new { @class = "Controllerdd" })
16: @Html.ValidationMessageFor(model => model.MainModel.DefaultControllerId, null, new { @class = "invalid-side-note" })
17:</dd>

一切都很好,我也更改了DefaultAreaId 的名称,但没有任何改变。 那么有人对此有任何解释吗?这里发生了什么? 如果需要,我可以复制我所有的视图、控制器和模型。

更新

在控制器中:

List<SelectListItem> Areas = new List<SelectListItem>();
Areas.Add(new SelectListItem { Text = "t1", Value = "13", Selected = false });
Areas.Add(new SelectListItem { Text = "t2", Value = "15", Selected = false });
Areas.Add(new SelectListItem { Text = "t3", Value = "17", Selected = false });
Areas.Add(new SelectListItem { Text = "t4", Value = "16", Selected = true });

Model.FKs.Add("DefaultAreaId", new ForeignKey { Title = "area", Items = Areas });

Fks:

public Dictionary<string, ForeignKey> FKs { get; set; }

ForeignKey 是:

public class ForeignKey {
    public string Title { get; set; }
    public List<SelectListItem> Items { get; set; }
}

【问题讨论】:

  • 能否补充一下如何获得物品??
  • @Wahid Bitar 我更新问题

标签: asp.net-mvc asp.net-mvc-3 html-helper html.dropdownlistfor


【解决方案1】:

当您创建 SelectList 时,您是在其中传递所选值还是通过选择列表项分配它。

var selectList = new SelectList([select list items], "[Key]", "[Value]", [SelectedValue]);
var selectList = new SelectList(list, "Id", "Name", 2);

谢谢,

【讨论】:

    【解决方案2】:

    在将模型发送到视图之前,您应该在控制器中分配默认值model.MainModel.DefaultAreaId

    更新:


    但这里有一个更好的方法“我认为 :)” 我有一个辅助方法可以在列表中设置 Selected Item,如下所示:

    public static IEnumerable<SelectListItem> SetSelected(this IEnumerable<SelectListItem> selectList, object selectedValue)
    {
        selectList = selectList ?? new List<SelectListItem>();
        if (selectedValue == null)
            return selectList;
        var vlaue = selectedValue.ToString();
        return selectList.BuildList(m => m.Text, m => m.Value, null, m => String.Equals(m.Value, vlaue, StringComparison.CurrentCultureIgnoreCase));
    }
    

    如果你想要 BuildList 助手,你可以在任何时候使用它来选择 SelectItem 列表

    public static IEnumerable<SelectListItem> BuildList<T>(IEnumerable<T> items, Func<T, string> text, Func<T, string> value = null, string optionalText = null, Func<T, bool> selected = null)
    {
        var list = items.Select(x => new SelectListItem
                                         {
                                                 Text = text.Invoke(x),
                                                 Value = value == null
                                                                 ? text.Invoke(x)
                                                                 : value.Invoke(x),
                                                 Selected = selected != null && selected.Invoke(x)
                                         }).ToList();
        if (optionalText != null)
            list.Insert(0, new SelectListItem() {Value = "", Text = optionalText});
        return list;
    }
    

    在控制器中什么也不做,只为模型设置你想要的值:

    public ActionResult Edit(){
       var model = new YourModel();
       model.CategoryId = 4;
       //.. set the dropdownlist items in the ViewData or in your model in your case
       return View(model);
    }
    

    在视图中像往常一样调用 DropDownListFor 并调用 SetSelected 辅助方法:

    @Html.DropDownListFor(model => model.CategoryId, ((IEnumerable<SelectListItem>)ViewData["Categories"]).SetSelected(model.CategoryId))
    

    这就是你的例子:

    @Html.DropDownListFor(model => model.MainModel.DefaultAreaId, Model.FKs["DefaultAreaId"].Items.SetSelected(model.MainModel.DefaultAreaId))
    

    别忘了在你的控制器中设置默认值。

    【讨论】:

    • 好的,我会试试你的答案,但是这里发生了什么?我的代码哪里出了问题?
    • 正如我告诉你的,我认为你的问题是因为在将模型发送到视图之前,你没有在控制器中设置 MainModel.DefaultAreaId
    • 顺便说一句,如果你也想要的话,我更新了我的答案以放置 BuildList 辅助方法:)
    • 谢谢你,你的权利,答案就是:将此添加到控制器:Model.MainModel.DefaultAreaId = 16;
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多