2011-03-26 30 views
2

如果我的要求是从一个单独的dll(DAL,Domain等)返回webform,winform,wpf表单等DropDownlist的数据。你会回来什么?从DAL或域或同等版本返回SelectListItem

我可以使用:

SelectListItem[] 

Ilist<SelectListItem> 

IEnumerable<SelectListItem> 

,并具有类似性质的其他人,但我不喜欢“SelectListItem”是联系在一起的System.Web.Mvc命名空间的方式。也许它只是我,但它似乎有点具体。我的webform可能甚至没有使用MVC,但它仍然可以工作?

回答

0

我想你已经回答了你自己的问题,因为从可能被不是asp.net MVC的应用程序使用的程序集中返回SelectList是不合适的。这甚至会导致WPF应用程序必须引用System.Web.Mvc。

更合适的体系结构将返回某种类型的IEnumerable,然后将其转换为当前应用程序类型的适当列表项类型。这种转换可能发生在某种适配器层或通过扩展方法,如果这对您更有帮助。

+0

是的,这是我的问题,其他人是怎么做的。你如何描述我是如何做到的,但是当SelectListItem返回某种类型时,不需要进行所有转换。我可以做DropDL.Foo = Repository.SomeListdata而不是havng来转换所有的时间。我实际上返回IEnumerable ,然后再转换,但我只是想获得其他想法 – 2011-03-26 19:59:55

+0

@William因此,你最好的选择是在你的应用程序中有一个FooDropDownService,它从数据存储获取你的Foo列表并转换为你的DropDownList类型应用。 – Swaff 2011-03-26 20:08:22

+0

这意味着必须为每个应用程序类型创建一个服务(一般来说,我的服务与存储库位于同一个dll中,并且由所有人使用)我想您可以创建您自己的FooSelectListItem类,以便由服务返回并从MVC DLL解耦 – 2011-03-26 20:14:23

0

我遇到了同样的问题,我的解决方案是在服务层创建一个小类,并将数据映射到视图中的SelectListItem。示例代码:

1)在服务层代用类:

public class SelectListItemBase 
{ 
    public String Value { get; set; } 
    public String Text { get; set; } 
} 

2)视图模型:

public class FetchWordsIntegrationViewModel 
{ 
    public IList<SelectListItemBase> WordTypes { get; private set; } 

    public FetchWordsIntegrationViewModel() 
    { 
     WordTypes = new List<SelectListItemBase>(); 

     WordTypes.Add(new SelectListItemBase() { Value = "0", Text = Constants.Ids.SelectionListDefaultText }); 
     WordTypes.Add(new SelectListItemBase() { Value = ((int)FetchedWordType.ProperNoun).ToString(), Text = "Proper noun" }); 
     // other select list items here 
    } 
} 

3)的代码,在动作

public ActionResult Index() 
{ 
    var vm = theService.CreateViewModel(); 
    return View(vm); 
} 

4 )使用Automapper进行映射(这不是必需的,因为SelectListItem可以使用LI很容易地生成NQ)

Mapper.CreateMap<SelectListItemBase, SelectListItem>(); 

5)最后,从该视图

@Html.DropDownListFor(m => m.WordTypes, 
    (IEnumerable<SelectListItem>)Mapper.Map(
     Model.WordTypes, 
     typeof(IList<SelectListItemBase>), 
     typeof(IList<SelectListItem>)) 
) 

正是由于这一简单的任务相当迂回,但允许期望的去耦,也允许容易地图等性能,如果需要的话代码。