编辑视图DDL不保持分组

时间:2017-01-27 14:08:08

标签: c# asp.net-mvc razor

在我的编辑操作中,我有这个:

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);    
    }
}

2 个答案:

答案 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)

问题在于创建自己的SelectListDropDownListFor只需要一个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);    
    }
}