在 ListBoxFor 中选择值的挑战 [英] Challenges with selecting values in ListBoxFor

查看:24
本文介绍了在 ListBoxFor 中选择值的挑战的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近在开发我的第一个 ASP.Net MVC2 Web 应用程序时,当我需要在列表框中选择多个值时遇到了一些问题.我用一些 jQuery 解决了这个问题,但继续将一些非常简单的代码放在一起来演示.我在模型中使用 EF,有两个实体 - 客户和 HelpDeskCalls:

控制器:

 public ActionResult Edit(int id){Customer currCustomer = ctx.Customers.Include("HelpDeskCalls").Where(c => c.ID == id).FirstOrDefault();列表currCustCalls = (ctx.HelpDeskCalls.Where(h => h.CustomerID == id)).ToList();列表currSelectItems = new List();列表<字符串>selectedValues = new List();foreach (HelpDeskCall currCall in currCustCalls){bool isSelected = (currCall.ID % 2 == 0) ?真假;//只选择偶数的ID...currSelectItems.Add(new SelectListItem() { Selected = isSelected, Text = currCall.CallTitle, Value = currCall.ID.ToString() });//将选定的值也添加到单独的列表中...如果(被选中){selectedValues.Add(currCall.ID.ToString());}}ViewData["currCalls"] = (IEnumerable) currSelectItems;ViewData["currSelected"] = (IEnumerable) selectedValues;返回视图(编辑",currCustomer);}

查看:

<%: Html.ListBoxFor(model => model.HelpDeskCalls, new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable) ViewData["currSelected"]), new { size = "12" })%><%: Html.ListBoxFor(model => model.HelpDeskCalls, ViewData["currCalls"] as IEnumerable<SelectListItem>, new { size = "12"}) %><%: Html.ListBox("Model.HelpDeskCalls", new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable)ViewData["currSelected"]), new { size = "12"}) %><%: Html.ValidationMessageFor(model =>model.HelpDeskCalls)%>

对于这个示例,我只是选择了偶数的 HelpDeskCall.ID.我正在为 ListBoxFor 尝试两种不同的语法:一种使用 IEnumerable 的值进行选择,一种使用 IEnumerable 的 SelectListItems.默认情况下,当我运行此代码时,不会对任一 ListBoxFor 进行选择,但非强类型 ListBox 会正确选择.

我在 ASP.Net 和 这篇文章://stackoverflow.com/questions/2308846/why-is-listboxfor-not-selecting-items-but-listbox-is">这个线程 上SO,但没有快乐.事实上,如果我将覆盖 ToString() 添加到我的 HelpDeskCall 类(如 ASP.net 线程中所建议的),则会选择所有值,这也不正确.

如果有人可以阐明这应该如何工作(以及我遗漏了什么或做错了什么),那么新手将非常感激.

解决方案

这是一个说明强类型版本的示例:

型号:

公共类 MyViewModel{公共 int[] SelectedItemIds { 获取;放;}公共 MultiSelectList 项目 { 获取;放;}}

控制器:

公共类 HomeController : 控制器{公共 ActionResult 索引(){//预选 id 为 1 和 3 的项目var selectedItemIds = new[] { 1, 3 };var 模型 = 新的 MyViewModel{项目 = 新的 MultiSelectList(新的[]{//TODO:从您的存储库中获取new { Id = 1, Name = "item 1" },new { Id = 2, Name = "item 2" },new { Id = 3, Name = "item 3" },},ID",姓名",所选项目 ID)};返回视图(模型);}}

查看:

<%: Html.ListBoxFor(x => x.SelectedItemIds, Model.Items) %>

Working on my first ASP.Net MVC2 web app recently, I came across some issues when I needed to select multiple values in a list box. I worked around it with some jQuery, but went ahead and put together some very simple code to demonstrate. I'm using EF for the model, with two entities - Customers and HelpDeskCalls:

Controller:

 public ActionResult Edit(int id)
    {
        Customer currCustomer = ctx.Customers.Include("HelpDeskCalls").Where(c => c.ID == id).FirstOrDefault();
        List<HelpDeskCall> currCustCalls = (ctx.HelpDeskCalls.Where(h => h.CustomerID == id)).ToList();
        List<SelectListItem> currSelectItems = new List<SelectListItem>();
        List<String> selectedValues = new List<string>();
        foreach (HelpDeskCall currCall in currCustCalls)
        {
            bool isSelected = (currCall.ID % 2 == 0) ? true : false;
            //Just select the IDs which are even numbers...
            currSelectItems.Add(new SelectListItem() { Selected = isSelected, Text = currCall.CallTitle, Value = currCall.ID.ToString() });
            //add the selected values into a separate list as well...
            if (isSelected)
            {
                selectedValues.Add(currCall.ID.ToString());
            }
        }
        ViewData["currCalls"] = (IEnumerable<SelectListItem>) currSelectItems;
        ViewData["currSelected"] = (IEnumerable<String>) selectedValues;
        return View("Edit", currCustomer);
    }

View:

<div class="editor-field">
    <%: Html.ListBoxFor(model => model.HelpDeskCalls, new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable) ViewData["currSelected"]), new { size = "12" })%>       
    <%: Html.ListBoxFor(model => model.HelpDeskCalls, ViewData["currCalls"] as IEnumerable<SelectListItem>, new { size = "12"}) %>
    <%: Html.ListBox("Model.HelpDeskCalls", new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable)ViewData["currSelected"]), new { size = "12"}) %>      
    <%: Html.ValidationMessageFor(model => model.HelpDeskCalls) %>
</div>

For this sample, I'm just selecting HelpDeskCall.IDs which are even. I'm trying two different syntaxes for ListBoxFor: One uses an IEnumerable of values for selections, one using an IEnumerable of SelectListItems. By default, when I run this code, no selections are made to either ListBoxFor, but the non-strongly typed ListBox selects correctly.

I read this post on ASP.Net and this thread on SO, but no joy. In fact, if I add the override ToString() to my HelpDeskCall class (as suggested in the ASP.net thread) all values are selected, which isn't right either.

If someone could shed some light on how this should work (and what I'm missing or doing wrong), this then neophyte would be very grateful.

解决方案

Here's an example illustrating the strongly typed version:

Model:

public class MyViewModel
{
    public int[] SelectedItemIds { get; set; }
    public MultiSelectList Items { get; set; }
}

Controller:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // Preselect items with id 1 and 3
        var selectedItemIds = new[] { 1, 3 };

        var model = new MyViewModel
        {
            Items = new MultiSelectList(
                new[] 
                {
                    // TODO: Fetch from your repository
                    new { Id = 1, Name = "item 1" },
                    new { Id = 2, Name = "item 2" },
                    new { Id = 3, Name = "item 3" },
                }, 
                "Id", 
                "Name", 
                selectedItemIds
            )
        };

        return View(model);
    }
}

View:

<%: Html.ListBoxFor(x => x.SelectedItemIds, Model.Items) %>

这篇关于在 ListBoxFor 中选择值的挑战的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆