代码改变世界

【翻译】ASP.NET MVC:转化业务对象到Select List Items上

2011-11-18 10:41  汤姆大叔  阅读(6254)  评论(2编辑  收藏  举报

我们经常将一些业务对象的Class绑定到Dropdown box或Select List上,而且业务对象一般都会有基类。这篇帖子里我讲展示给大家的是如何利用业务对象的基类,写少量代码用扩展方法实现转换业务对象集合到ASP.NET MVC上的Select上。

BusinessBase, BaseEntity和其他基类

我喜欢为所有的业务类设置基类,以便于在上下文里我可以很容易地使用它们。

    NB!很多人说为所有的业务类设置基类是不错的注意,它们也建议在数据库里用同样的方式,以便和基类进行mapping,但是有的人设置基类很不错,但是不建议在数据库层面也坐这种事情(比如,所有的业务对象都要包含标识)。具体使用,还是取决于你自己。

为了让例子简单,我使用非常简单的基类做演示,基类里只有一个ID属性。

public class BaseEntity
{
public virtual long Id { get; set; }
}

现在基类里有了ID属性,还有一个问题需要解决:怎么展示业务对象?只显示ID显然不够友好,我们需要让信息显示得更加友好。我们可以声明一个抽象属性让所有的子类都集成,但是为什么不用系统自带的ToString()呢?只需要在业务对象里重写它就OK了。

public class Product : BaseEntity
{
public virtual string SKU { get; set; }
public virtual string Name { get; set; }

public override string ToString()
{
if (string.IsNullOrEmpty(Name))
return base.ToString();

return Name;
}
}

当然,你也可以添加更多的功能和属性到你的基类里,我们现在需要的就是:标识和业务对象展示给用户看的信息。

List items转换方法


现在我们可以写一个方法来创建List items

public static class BaseEntityExtensions
{
public static IEnumerable<SelectListItem> ToSelectListItems<T>
(this IList<T> baseEntities) where T : BaseEntity
{
return ToSelectListItems((IEnumerator<BaseEntity>)
baseEntities.GetEnumerator());
}

public static IEnumerable<SelectListItem> ToSelectListItems
(this IEnumerator<BaseEntity> baseEntities)
{
var items = new HashSet<SelectListItem>();

while (baseEntities.MoveNext())
{
var item = new SelectListItem();
var entity = baseEntities.Current;

item.Value = entity.Id.ToString();
item.Text = entity.ToString();

items.Add(item);
}

return items;
}
}

可以看到,有2个方法重载,一个使用List<T>,一个使用IEnumerator<BaseEntity>.虽然大多数情况下我们都使用IList<T>,我还是提供了另外一个重载。

使用该扩展方法

在你的代码里,你可以像下面的代码一样使用ToSelectListItems()扩展方法。

...
var model = new MyFormModel();
model.Statuses = _myRepository.ListStatuses().ToSelectListItems();
...


你可以在所有继承该基类的业务类上都可以使用这个扩展方法来达到绑定数据到List item上的目的。

网友改进

public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> baseEntities) where T : BaseEntity
{

return baseEntities.Select(x => new SelectListItem {
Value = x.Id.ToString(),
Text = x.ToString() });

}


原文地址:http://weblogs.asp.net/gunnarpeipman/archive/2011/11/10/asp-net-mvc-converting-business-objects-to-select-list-items.aspx