在ListBoxFor中select值的挑战
这是我的第一个问题,可能是一个很差的,所以请温柔。
最近在我的第一个ASP.Net MVC2 web应用程序上工作,当我需要在列表框中select多个值时,遇到了一些问题。 我用一些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); }
视图:
<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>
对于这个例子,我只是select了偶数的HelpDeskCall.IDs。 我想为ListBoxFor尝试两种不同的语法:一个使用一个IEnumerable值来进行select,一个使用IEInumerable的SelectListItems。 默认情况下,当我运行这个代码时,没有select任何一个ListBoxFor,但非强types的ListBoxselect正确。
我在ASP.Net上阅读这篇文章 ,并在SO上阅读这篇文章 ,但没有喜悦。 事实上,如果我将Override ToString()添加到我的HelpDeskCall类(如ASP.net线程中所build议的那样),则所有值都被选中,这也是不正确的。
如果有人能够说明这个应该如何工作(以及我错过什么或做错了什么),那么这个新手会非常感激。
约翰
以下是一个说明强types版本的例子:
模型:
public class MyViewModel { public int[] SelectedItemIds { get; set; } public MultiSelectList Items { get; set; } }
控制器:
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); } }
视图:
<%: Html.ListBoxFor(x => x.SelectedItemIds, Model.Items) %>
我不知道在我使用的MVC3的RTM中这个行为是否已经改变了,但是看起来现在的select和绑定是可以使用的。 唯一的问题是模型应该包含一个带有ID的属性,如下所示:
public class MyViewModel { public int[] ItemIDs { get; set; } }
然后,在视图中的以下内容将正常工作,预先select正确的值,并在后期正确绑定:
@Html.ListBoxFor(model => model.ItemIDs, (IEnumerable<SelectListItem>)(new[] { new SelectListItem() { Value = "1", Text = "1" }, new SelectListItem() { Value = "2", Text = "2" } }))
我find了更好的解决方法。 通常的方式来预先select列表:
@Html.ListBoxFor( model => model.Roles, new MultiSelectList(db.Roles, "Id", "Name") ) @Html.ValidationMessageFor(model => model.Roles)
不工作..,永远不会select任何选项,直到:
public ActionResult Edit(int id) { var user = db.Users.Find(id); // this is workaround for http://aspnet.codeplex.com/workitem/4932?ProjectName=aspnet ViewData["Roles"] = user.Roles.Select(r => r.Id); return View(user); }
选定的angular色必须存储在ViewData中,以解决讨厌的错误。
- 在控制台应用程序中从ASP.NET Razor模板生成HTML的最佳解决scheme是什么?
- configurationASP.NET MVC进行针对AD的身份validation
- 在Asp.Net MVC中设置“主页”
- 在ASP.NET MVC 4应用程序中打印版本号
- 如何使用Html.TextBoxFor设置文本框的宽度
- 在asp.net mvc有可能使一个通用的控制器?
- 我如何testing与构造函数参数的行动filter的存在?
- Windows更新后“名称空间”System.Web.Mvc“中不存在types或名称空间名称”Html“
- ASP.NET(OWIN)身份:如何从Web API控制器获取用户ID?