在我的编辑操作中,我有这个:
ViewBag.DropDownList2= new SelectList(ClassName.lstItems(), "Value", "Text", object.ItemID);
这与我的Create Action不同,而我只是这样:
ViewBag.DropDownList2= ClassName.lstItems();
原因是因为我需要保留用户在创建/编辑记录时最初选择的值。
ClassName.lstItems()
public static List<SelectListItem> lstItems()
{
List<SelectListItem> lstAllItems = new List<SelectListItem>();
using (var context = new ConnectionString())
{
List<Table1> lstTable1Items =
context.Table1.Where(x => x.deleted == false).ToList();
var groups =
lstTable1Items .OrderBy(x => x.Table2.Property1).GroupBy(x => x.Table2.Property1);
foreach (var group in groups)
{
var slg = new SelectListGroup() {Name = group.Key};
foreach (Table1 table1Item in group)
{
SelectListItem item = new SelectListItem() {Text = table1Item .PropertyText, Value = table1Item .ID.ToString(), Group = slg};
lstAllItems.Add(item);
}
}
}
return lstAllItems;
}
显然我想要一个分组的下拉列表。但在我的编辑操作中,它没有分组。如何将我的下拉列表分组,同时将原始值作为页面加载时的选定值?
剃刀
<div class="form-group">
@Html.LabelFor(model => model.itemID, htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-8">
@Html.DropDownList("DropDownList2", null, "Select Item", htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.itemID, "", new { @class = "text-danger" })
</div>
</div>
更新
public class TestClass
{
private ConnectionString context;
public TestClass()
{
context = new ConnectionString();
}
public IEnumerable<SelectListItem> GetListItems()
{
TestClass className = new TestClass();
// assumes `context` is a field on your class,
// set in the contructor, after being injected
return className.context.Table1
.Where(x => x.deleted == false)
.GroupBy(x => x.Table2.Property1)
.Select(x => {
var group = new SelectListGroup { Name = x.Key };
return x.Select(i => new SelectListItem
{
Text = i.PropertyText,
Value = i.ID.ToString(),
Group = group
});
})
.SelectMany(x => x);
}
}
答案 0 :(得分:1)
您正在SelectList
列表中创建新的SelectListItems
,因此无法进行分组。最佳解决方案是使用SelectListItem
列表并使用DropDownListFor
辅助方法。
var yourViewModel = new YourViewModel();
ViewBag.DropDownList2 = lstItems();
yourViewModel.SelectedItemId= "b"; // replace with the value you want set selected as
return View(yourViewModel);
现在在您的视图中强选键入YourViewModel
@Html.DropDownListFor(s=>s.SelectedItemId, ViewBag.DropDownList2 as List<SelectListItem>)
答案 1 :(得分:0)
问题在于创建自己的SelectList
。 DropDownListFor
只需要一个IEnumerable<SelectListItem>
。 Razor可以负责创建SelectList
并根据ModelState
中的数据选择合适的项目。
一般情况下,您只需将ViewBag.DropDownList2
设置为ClassName.lstItems()
的返回值,然后让Razor处理它。
也就是说,这里的代码存在一些问题。首先,最重要的是,您应该避免创建上下文的多个版本,并且绝对在静态方法中。几乎没有失败,using
与实体框架上下文相结合,意味着你做错了什么,你最终会得到它。相反,将您的上下文注入需要使用它的类,手动或使用依赖注入容器。您的上下文应该具有请求生存期,即您应该对单个请求中的所有内容使用相同的上下文。
其次,您的lstItems
代码可以大大简化:
public class TestClass
{
private ConnectionString context;
public TestClass()
{
context = new ConnectionString();
}
public IEnumerable<SelectListItem> GetListItems()
{
TestClass className = new TestClass();
// assumes `context` is a field on your class,
// set in the contructor, after being injected
return className.context.Table1
.Where(x => x.deleted == false)
.GroupBy(x => x.Table2.Property1)
.Select(x => {
var group = new SelectListGroup { Name = x.Key };
return x.Select(i => new SelectListItem
{
Text = i.PropertyText,
Value = i.ID.ToString(),
Group = group
});
})
.SelectMany(x => x);
}
}