asp.net-mvc – ASP.NET MVC 3列表到IEnumerable

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC 3列表到IEnumerable前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前不满意填充DropDownListFor()对象的方式.我试图找到尽可能填充IEnumerable的通用方法.这就是我到目前为止所拥有的.

帮手:

public static List<SelectListItem> ToSelectList(IDictionary<string,string> dictionaryItems,string selectedValue,string noSelection,bool search = false)
    {
        List<SelectListItem> items = new List<SelectListItem>();

        if (search)
        {
            items.Add(new SelectListItem { Selected = true,Value = "-1",Text = string.Format("-- {0} --",noSelection) });
        }

        foreach (var item in dictionaryItems)
        {
            items.Add(new SelectListItem
            {
                Text = item.Key,Value = item.Value,Selected = selectedValue == item.Value ? true : false
            });
        }

        return items
            .OrderBy(l => l.Text)
            .ToList();
    }

控制器:

[HttpGet]
    public ActionResult Index()
    {
        var model = new CreateModel();

        var parentOrganisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
            .OrderBy(o => o.OrganisationName);

        Dictionary<string,string> items = new Dictionary<string,string>();

        foreach (var item in parentOrganisations)
        {
            items.Add(item.OrganisationName,item.ID.ToString());
        }

        model.Organisations = SelectLists.ToSelectList(items,"-1","-- None -- ",true);

        return View(model);
    }

视图:

<div class="control-group">
        <label class="control-label">Parent Organisation</label>
        <div class="controls">
            @Html.DropDownListFor(m => m.ParentOrganisationID,Model.Organisations,new { @class = "input-xlarge"})
            <p class="help-block">Select a parent organisation to create a branch</p>
        </div>
    </div>

控制器中似乎有很多重复的代码.它需要一个通用列表,将值和文本添加到字典中,然后将其用作帮助程序的输入,该帮助程序构建选择列表以作为模型的一部分发送.

有没有人有更好的方法来实现这一目标?我讨厌在我的控制器中臃肿,当我在表单上得到几个下拉时,这正是在这个实例中会发生的事情.

谢谢,

编辑 – 感谢Kenneth的帮助方法,我现在将整个事情整合到控制器中的一个调用中:

model.Organisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
            .OrderBy(o => o.OrganisationName)
            .ToList()
            .ToSelectList(org => org.OrganisationName,org => org.ID.ToString(),"None",true);

解决方法

您可以提供获取密钥和值的回调,然后使用它们.除此之外,您可以将其创建为扩展方法

扩展方法

public static List<SelectListItem> ToSelectList<T>(this List<T> Items,Func<T,string> getKey,string> getValue,noSelection) });
        }

        foreach (var item in Items)
        {
            items.Add(new SelectListItem
            {
                Text = getKey(item),Value = getValue(item),Selected = selectedValue == getValue(item) ? true : false
            });
        }

        return items
            .OrderBy(l => l.Text)
            .ToList();
    }

用法

List<Org>() parentOrganisations = // fetch here
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(),org => org.OrganisationName,true);

注意:我在SO编辑器中键入了这个,因此您可能会遇到一些语法错误(尽管它们应该很容易解决).

原文链接:https://www.f2er.com/aspnet/245108.html

猜你在找的asp.Net相关文章