ASP.Net MVC 5在加载列表框中选择多个项目
问题描述:
围绕MVC环绕我的头。ASP.Net MVC 5在加载列表框中选择多个项目
我有一个项目列表。我需要加载一些默认选择的屏幕。
加载项目是一回事,试图选择一些默认情况下不适合我。
任何想法我错了?
我知道有很多类似问题的答案,但我似乎无法将答案翻译成我的需求。
这里是我有的代码,并试过 - 我也试图了解html助手中的各种选项。发布解决方案时请考虑这一点。
这是我最近的代码迭代;我已经通过了一堆了....
在我的控制器:
public ActionResult Index()
{
ViewBag.Statuses = AddStatuses();
return View();
}
private MultiSelectList AddStatuses()
{
string[] defaultSelected = { "Ready", "Done", "Error" };
List<SelectListItem> listItems = new List<SelectListItem>();
List<Status> s = allTypes.GetStatuses();
s.ForEach(status =>
{
listItems.Add(new SelectListItem()
{
Text = status.Name,
Value = status.ID.ToString(),
Selected = true,// defaultSelected.Contains(status.Name)
});
});
return new MultiSelectList(listItems, "Value", "Text");
}
在试图测试我defaultSelected.Contains,我只是评论它选择ALL作为真正的...还是没“T工作...
我已经在我看来,尝试这些
@Html.DropDownList("Statuses", null, null, new { @class = "form-control", multiple = true, id="queueStatuses" })
@Html.ListBox("Name", ViewBag.Statuses as MultiSelectList, new { @class = "form-control", id = "queueStatuses" })
@Html.ListBox("Statuses", null, new { @class = "form-control", id = "queueStatuses" })
我一)不明白我在做什么和b)不能得到它的工作... :)
我要找:
答
谢谢@Shyju。我相信你的答案是有效的。
正如我在评论中提到的那样,我不想在这种情况下通过视图模型的环节。我正在寻找一种简单的方法来实现这一点。
似乎我所需要做的就是改变我的MultiSelectList
并传入一组选定的'值'。
这解决了我的问题:
private MultiSelectList AddStatuses()
{
string[] defaultSelected = { "3", "5", "6" };
List<SelectListItem> allItems = new List<SelectListItem>();
List<Status> s = allTypes.GetStatuses();
s.ForEach(status =>
{
allItems.Add(new SelectListItem()
{
Text = status.Name,
Value = status.ID.ToString(),
});
});
return new MultiSelectList(allItems, "Value", "Text", defaultSelected);
}
而且我ListBox
是一样的。与这一个到底:
@Html.ListBox("status", (IEnumerable<SelectListItem>)ViewBag.Statuses, new { @class = "form-control" })
答
可以使用ListBoxFor
helper方法与视图模型的用户一起传递物品的列表框中。
因此,创建一个新的视图模型将数据从你的操作方法转移到查看
public class CreateIssue
{
public List<SelectListItem> Statuses { set;get;}
public int[] SelectedStatuses { set;get;}
}
现在在你的GET行动,创建一个这样的对象,加载Statuses
收集,并将其发送给视图。如果要预选某些项目,请设置SelectedStatuses
属性。
public ActionResult Index()
{
var vm = new CreateIssue();
//Hard coded for demo. You may replace with values coming from db table.
vm.Statuses = new List<SelectListItem> {
new SelectListItem { Value="1", Text="Ready"},
new SelectListItem { Value="2", Text="Done"},
new SelectListItem { Value="3", Text="Building"},
new SelectListItem { Value="4", Text="Error"},
};
//For preselecting items, set it here
vm.SelectedStates=new int[] { 2,3};
return View(vm);
}
和你在你看来,这是强类型的视图模型,使用ListBoxFor
的辅助方法。
@model CreateIssue
@using (Html.BeginForm())
{
<label>Select many statuses</label>
@Html.ListBoxFor(m => m.SelectedStatuses, Model.Statuses)
<input type="submit"/>
}
我怎样才能得到它与ViewBag的工作 - 而不是在这里使用viewmodel;我将在页面上使用Ajax,因此整个视图模型不是必需的 - 而且WOW只是选择一些默认项目而已。 – Darren
视图模型如何影响ajax方法? – Shyju
它并不是真的,但我的目标是保持这种简单。你的代码尽管我很确定,但需要的不仅仅是我相信只需要加载一列值并具有一些预选的列表框。另外(我是新的MVC)你有你的ActionResult创建 - 这是什么,它将如何被称为?我有一个索引操作。那不是我的管理员打来的?这是如何创建行为的? – Darren