【问题标题】:How to code a C# Extension method to turn a Domain Model object into an Interface object?如何编写 C# 扩展方法以将域模型对象转换为接口对象?
【发布时间】:2010-04-06 21:48:03
【问题描述】:

当您有一个需要显示为界面控件的域对象时,例如下拉列表,ifwdev 建议创建一个扩展方法来添加一个 .ToSelectList()。

原始对象是一个对象列表,其属性与下拉列表的 .Text 和 .Value 属性相同。基本上,它是一个 SelectList 对象的列表,只是类名不同。

我想您可以使用反射将域对象转换为接口对象。有人对可以做到这一点的 C# 代码有任何建议吗? SelectList 是一个 MVC 的 SelectListItem 下拉列表。

想法当然是在视图中做这样的事情:

<%= Html.DropDownList("City", 
         (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList() )

【问题讨论】:

  • 通过反射,我的意思是读取源对象的属性并将它们与 SelectList 属性匹配,返回正确的 DropDownList 选择列表。

标签: asp.net-mvc domain-driven-design selectlist selectlistitem


【解决方案1】:

使SelectList 成为ViewModel 对象的一部分更容易。

无论如何,您只需遍历IEnumerable 并将每个项目添加到新的SelectList 对象并返回它。

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

How to refactor these 2 similar methods into one?

【讨论】:

  • +1 用于在视图模型中具有格式化的选择列表数据。它更容易测试。
  • 如果你愿意,你有 ViewModel 模式的链接吗?除了域模型之外,我们是否正在谈论为每个视图创建一个类?我想存储库不会返回任何这些,那么您是否使用工厂来创建视图模型?
  • 给你:nerddinnerbook.s3.amazonaws.com/Part6.htm。 ViewModel 是一个类对象,它包含渲染视图所需的所有数据(包括 SelectLists 之类的内容)。
  • 嘿。我什至把那本书放在我的书架上,把笔记放在我的笔记本上。我缺少的部分是:界面元素在控制器中可用。谢谢;)
【解决方案2】:

这是我用来创建选择列表的两种扩展方法。

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value)
{
    return collection.ToSelectList(text, value, x => false);
}

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected)
{
    return (from item in collection
            select new SelectListItem()
                       {
                           Text = text(item),
                           Value = value(item),
                           Selected = selected(item)
                       });
}

HTH,
查尔斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多