【翻译】ASP.NET MVC:转化业务对象到Select List Items上
2011-11-18 10:41
281 查看
我们经常将一些业务对象的Class绑定到Dropdown box或Select List上,而且业务对象一般都会有基类。这篇帖子里我讲展示给大家的是如何利用业务对象的基类,写少量代码用扩展方法实现转换业务对象集合到ASP.NET MVC上的Select上。
BusinessBase, BaseEntity和其他基类
我喜欢为所有的业务类设置基类,以便于在上下文里我可以很容易地使用它们。
NB!很多人说为所有的业务类设置基类是不错的注意,它们也建议在数据库里用同样的方式,以便和基类进行mapping,但是有的人设置基类很不错,但是不建议在数据库层面也坐这种事情(比如,所有的业务对象都要包含标识)。具体使用,还是取决于你自己。
为了让例子简单,我使用非常简单的基类做演示,基类里只有一个ID属性。
现在基类里有了ID属性,还有一个问题需要解决:怎么展示业务对象?只显示ID显然不够友好,我们需要让信息显示得更加友好。我们可以声明一个抽象属性让所有的子类都集成,但是为什么不用系统自带的ToString()呢?只需要在业务对象里重写它就OK了。
当然,你也可以添加更多的功能和属性到你的基类里,我们现在需要的就是:标识和业务对象展示给用户看的信息。
List items转换方法
现在我们可以写一个方法来创建List items
可以看到,有2个方法重载,一个使用List<T>,一个使用IEnumerator<BaseEntity>.虽然大多数情况下我们都使用IList<T>,我还是提供了另外一个重载。
使用该扩展方法
在你的代码里,你可以像下面的代码一样使用ToSelectListItems()扩展方法。
你可以在所有继承该基类的业务类上都可以使用这个扩展方法来达到绑定数据到List item上的目的。
网友改进
原文地址:http://weblogs.asp.net/gunnarpeipman/archive/2011/11/10/asp-net-mvc-converting-business-objects-to-select-list-items.aspx
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
相关文章推荐
- asp.net mvc SelectList 的selected 失效及解决方案
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
- [转]ASP.NET MVC Select List Example
- asp.net mvc SelectList 的selected 失效及解决方案
- asp.net mvc SelectList 的selected 失效及解决方案
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
- asp.net mvc SelectList 的selected 失效及解决方法
- asp.net MVC 将 DataTable转化为客户端的JSon字符串及Ext JSon对象
- 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑
- asp.net mvc SelectList 的selected 失效及解决方案
- ASP.NET.MVC--注解和反射将Enum转换List<SelectListItem>为@Html.DropDownListFor()下拉列表的通用方法
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
- 一段用于生成 ASP.NET MVC 中 DropDownListFor 的 SelectListItem 可枚举的集合
- asp.net mvc SelectList使用
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List<T>转JSON,JSON转List<T>,JSON转C#对象
- 一段用于生成 ASP.NET MVC 中 DropDownListFor 的 SelectListItem 可枚举的集合
- asp.net中将dataTable数据转化为List<>
- [翻译]ASP.NET MVC 3 开发的20个秘诀(九)[20 Recipes for Programming MVC 3]:对列表进行筛选
- ASP.NET MVC 2 Templates, Part 1: Introduction[翻译]