【问题标题】:How do I use a SelectListItem in ASP.NET MVC to display choices via a List Box or Check List box如何在 ASP.NET MVC 中使用 SelectListItem 通过列表框或检查列表框显示选择
【发布时间】:2016-08-15 07:59:57
【问题描述】:

我已经阅读了几篇关于如何向用户展示选择的文章。有的用ListBoxFor,有的用CheckBoxFor,然后就是这个东西叫MultiSelectList。

我(曾经)感到困惑的是,每个示例似乎都以完全不同的方式完成了它,而且它们都没有真正使用内置的“SelectListItem”类,而是总是创建自己的。

所以我原本打算发布一个要求一般性澄清的问题,但我认为它只是代表所有其他各种帖子并且重复。

所以让我重新表述一下:您如何使用“列表”或“多选列表”向用户呈现选项列表,包括将选项显示为复选框列表的选项?

换句话说,如果我的模型中有以下 2 项,我将如何将它们中的每一项显示为典型的选择列表框或典型的检查列表框?

public List<SelectListItem> Widgets1 { get; set; }
public MultiSelectList Widgets2 { get; set; }

【问题讨论】:

  • 你一个问题都没问!这个问题或您的任何答案都不会帮助任何人。
  • 你是对的。我看到 Stack Overflow 向我展示了“回答您自己的问题并分享知识”的选项,所以我想这就是这篇文章的内容。
  • 如果你真的在回答一个问题,那很好,但没有问题,所以你自己的回答没有意义
  • 所以我有点困惑..这像危险吗?我是否必须说“如何在清单中显示数据?”然后转身说“这就是方法..”:)
  • 您不了解 SO 是什么。它的目标是建立一个问题和答案的存储库。一个问题需要一个问题的清晰陈述,与之相关的代码,以及对什么不起作用的解释。你什么都没做。如果您想写自己的博客,请继续,但不要使用 SO。

标签: asp.net-mvc selectlistitem html.listboxfor


【解决方案1】:

警告...只是想指出,一旦您有太多选择,“复选框”选项基本上会挂起。 (例如将我的循环更改为 500),它基本上不会提交。

问题可追溯到 CheckBoxFor 行的验证。这可以通过将一行更改为...来解决。

                        @Html.CheckBoxFor(cc => cc.WidgetsAsCheckList[myIndex].Selected, new { data_val = "false",  htmlAttributes = new { @class = "form-control" } })

如果我这样做,我可以在检查列表中有 1,500 个项目,并且提交会在 3 秒内完成

【讨论】:

    【解决方案2】:

    让我们从模型开始。它非常基础,您可以看到我只是创建了 3 个存储相同数据的列表。

    这里的主要区别是我阅读的所有示例,人们创建自己的项目类,我想简单地使用内置的“SelectListItem”类

    public class FooModel
    {
      [Display(Name = "WidgetCheckList")]
      public List<SelectListItem> WidgetsAsCheckList { get; set; }
    
      [Display(Name = "WidgetListBox")]
      public List<SelectListItem> WidgetsAsListBox { get; set; }
    
      [Display(Name = "WidgetMultiSelectList")]
      public MultiSelectList WidgetMultiSelectList { get; set; }
    
      //We have to create a bucket that not only some how 
      //auto-magically knowns what has been pre-selected in the 
      //original list, but provides the view something to store
      //the new selections in when returning to the controller.
      //I have to admit, I have no idea how this knows what was
      //pre-selected, but being new at MVC, there are things I 
      //just have to leave it as a mystery becuase it just works.
    
      [HiddenInput(DisplayValue = false)]
      public List<string> userSelectionsAsListBox { get; set; }
    
      [HiddenInput(DisplayValue = false)]
      public List<string> userSelectionsAsMultiSelectList { get; set; }
    
      public FooModel()
      {
        this.WidgetsAsCheckList = new List<SelectListItem>();
        this.WidgetsAsListBox = new List<SelectListItem>();
        this.WidgetMultiSelectList = new MultiSelectList(new List<SelectListItem>());
      }
    }   
    

    对于Controller,因为这是一个学习测试,所以我只是编造了数据。这里的关键是我构建了一个 SelectListItems 列表,然后使用同一个列表填充模型的所有 3 个演示字段,以显示处理相同数据的 3 种不同方式。

    // ------------------------------------------------------------------------
    [HttpGet]       //Display the Edit view
    public ActionResult Edit()
    {
        FooModel myModel = new FooModel;
    
        //For testing, here I'm going to Inject some Choices
        //So first we build a list of them
        List<SelectListItem> myChoices = new List<SelectListItem>();
        for (Int32 myIndex = 1; myIndex < 15; myIndex++)
        {
            SelectListItem myChoice = new SelectListItem();
            myChoice.Value = myIndex.ToString();
            myChoice.Text = "Choice " + myIndex.ToString();
            if ((myIndex % 2) == 0)
            {
                myChoice.Selected = true;
            }
            else
            {
                myChoice.Selected = false;
            }
            myChoices.Add(myChoice);
        }
    
        String[] mySelections = myChoices.Where(x => x.Selected == true).ToArray().Select(x => x.Value).ToArray();
    
        //Now we use that same list to populate all 3 variations in our model
        myModel.WidgetsAsCheckList.AddRange(myChoices);
        myModel.WidgetsAsListBox.AddRange(myChoices);
        myModel.WidgetMultiSelectList = new MultiSelectList(myChoices, "Value", "Text", mySelections); 
    
        return View(myModel);
    }
    

    现在对于视图,我显示每个列表。第一个当然是复选框,第二个和第三个是列表框,但使用不同的底层对象...

    @* This displays the "list" of SelectListItems as Checkboxes but we have to do alot more work *@
    <div class="form-group">
        @Html.LabelFor(model => model.WidgetsAsCheckList, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            <div class="form-control" style="overflow-y: scroll; height: 25em; width:280px;">
                @for (var myIndex = 0; myIndex < Model.WidgetsAsCheckList.Count; myIndex++)
                {
                    @Html.CheckBoxFor(cc => cc.WidgetsAsCheckList[myIndex].Selected, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.HiddenFor(cc => cc.WidgetsAsCheckList[myIndex].Value, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.DisplayFor(cc => cc.WidgetsAsCheckList[myIndex].Text, new { htmlAttributes = new { @class = "form-control" } })
                    <br />
                }
            </div>
        </div>
    
    </div>
    
     @* This displays the "list" of SelectListItems as list box that does all the work for us *@
    <div class="form-group">
        @Html.LabelFor(model => model.WidgetsAsListBox, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">                
            @Html.ListBoxFor(model => model.userSelectionsAsListBox, Model.WidgetsAsListBox, new { @class = "form-control", size = 25 })
        </div>
    </div>
    
    @* This displays the "MultiSelectList" as list box that does all the work for us *@
    <div class="form-group">
        @Html.LabelFor(model => model.WidgetMultiSelectList, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.ListBoxFor(model => model.userSelectionsAsMultiSelectList, Model.WidgetMultiSelectList, new { @class = "form-control", size = 25 })
        </div>
    </div>
    

    最后,当用户做出自己的选择(或接受预先选择的选择)并点击提交时,我们可以在控制器中简单地通过......

    // ---------------------------------------------------------------------
    [HttpPost]       
    [ValidateAntiForgeryToken]
    public ActionResult Edit(FooModel myFooModel)
    {
    
        List<string> SelectedItemsFromListBox = myFooModel.userSelectionsAsListBox;
    
        List<string> SelectedItemsFromMultiSelectList = myFooModel.userSelectionsAsMultiSelectList;
    
        List<string> SelectedItemsFromCheckList = myFooModel.WidgetsAsCheckList.Where(x => x.Selected == true).ToList().Select(x => x.Value).ToList();
    
    }
    

    【讨论】:

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