在ListBoxFor中选择值的挑战

Joh*_*831 45 asp.net-mvc asp.net-mvc-2

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

控制器:

 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);
    }
Run Code Online (Sandbox Code Playgroud)

视图:

<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>
Run Code Online (Sandbox Code Playgroud)

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

我读这篇文章的ASP.Net和这个线程的SO,但没有喜悦.实际上,如果我将覆盖ToString()添加到我的HelpDeskCall类(如ASP.net线程中所建议的那样),则选择所有值,这也是不对的.

如果有人能够阐明这应该如何发挥作用(以及我错过或做错了什么),那么新手就会非常感激.

Dar*_*rov 91

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

模型:

public class MyViewModel
{
    public int[] SelectedItemIds { get; set; }
    public MultiSelectList Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<%: Html.ListBoxFor(x => x.SelectedItemIds, Model.Items) %>
Run Code Online (Sandbox Code Playgroud)

  • 你是男人!:D感谢您在StackOverflow中提供如此优质且干净的代码示例.上帝保佑你的生命! (6认同)

kka*_*ara 8

我不知道在我使用的MVC3的RTM中这种行为是否已经改变,但是现在选择和绑定似乎是开箱即用的.唯一的问题是模型应该包含带有ID的属性,如下所示:

public class MyViewModel {
    public int[] ItemIDs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后视图中的以下内容将正常工作,既可以预先选择正确的值,也可以在发布期间正确绑定:

@Html.ListBoxFor(model => model.ItemIDs, (IEnumerable<SelectListItem>)(new[] { 
                                new SelectListItem() { Value = "1", Text = "1" }, 
                                new SelectListItem() { Value = "2", Text = "2" } 
                             }))
Run Code Online (Sandbox Code Playgroud)

  • 一个小小的修正.即使上述工作,似乎有一些可能导致问题的小错误.似乎当ViewBag包含名为"X"的属性并且模型的属性也被命名为"X"时,ListBox的自动选择不起作用......奇怪的事情...... (5认同)