【问题标题】:Preselect Items in Multiselect-Listbox (MVC3 Razor)多选列表框中的预选项目(MVC3 Razor)
【发布时间】:2011-08-17 01:14:31
【问题描述】:

我在列表框中预选项目时遇到问题。 我正在使用带有 mvc 3 的 razor 视图引擎。我知道有一些帖子存在相同的问题,但它们对我不起作用。

类中的代码:

public class Foo{
    private int _id;
    private string _name;

    public string Name{
       get{
           return _name;
       }

    public int Id {
       get{
           return _id;
       }

}

模型中的代码:

public class FooModel{

    private readonly IList<Foo> _selectedFoos;
    private readonly IList<Foo> _allFoos;

    public IList<Foo> SelectedFoos{
         get{ return _selectedFoos;}
    }

    public IList<Foo> AllFoos{
         get{ return _allFoos;}
    }

}

cshtml中的代码:

 @Html.ListBoxFor(model => model.Flatschels, 
        Model.AllFlatschels.Select(fl => new SelectListItem {
             Text = fl.Name,
             Value = fl.Id.ToString(),
             Selected = Model.Flatschels.Any(y => y.Id == fl.Id)
   }), new {Multiple = "multiple"}) 

我尝试了很多其他方法,但都没有奏效。希望有人能帮忙。

【问题讨论】:

    标签: .net asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    我无法真正解释原因,但我设法让它发挥作用。这些都有效:

    @Html.ListBoxFor(m => m.SelectedFoos,
                new MultiSelectList(Model.AllFoos, "ID", "Name"), new {Multiple = "multiple"}) 
    
    @Html.ListBoxFor(m => m.SelectedFoos, Model.AllFoos
                .Select(f => new SelectListItem { Text = f.Name, Value = f.ID }),
                    new {Multiple = "multiple"}) 
    

    问题似乎是 SelectListItem 上的 Selected 属性被忽略,而是调用了 ToString()(!) 方法,因此如果您需要将此添加到您的 Foo 类中:

    public override string ToString()
    {
        return this.ID;
    }
    

    我猜这与能够跨请求持续存在有关(这将被压扁为要通过网络传递的字符串),但这有点令人困惑!

    【讨论】:

    • 非常感谢。我让它工作了。尽管只有第二个代码有效,但在我看来,这不是因为覆盖了 ToString()。我的 Id 属性是一个 int,我添加了一个返回唯一字符串 (guid.ToString()) 的属性键。
    • 很奇怪。无法解释 ToString 的事情,但很高兴你把它排序了 :-)
    • 这绝对是因为 ToString()。刚刚在 Microsoft 论坛上发布了一个问题,希望能得到答案,或许还能了解为什么(以及多长时间)这是他们目前的样子。
    • 在 Razor for MVC4 上的行为相同。错误的边界(至少对于 ListBox(),它不期望模型比较元素)。
    • 也为我工作!无论出于何种原因,以下 没有 工作:@Html.DropDownListFor(m =&gt; m.SelectedFoos, new MultiSelectList(Model.AllFoos), new {multiple = ""}(在我的情况下,Foo 是一个枚举,而不是一个元组对象。我需要做的唯一更改是 DropDownListFor - > ListBoxFor
    【解决方案2】:

    在 MVC5 中,您可以直接将 ListBoxFor 与多选一起使用。确保在加载视图时您的 selectedItem 应该有项目列表。

    @Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多