Возврат SelectListItem из DAL или Домена или эквивалентного - PullRequest
2 голосов
/ 26 марта 2011

Если бы моим требованием было вернуть данные для DropDownlist в веб-форме, winform, wpf-форме и т. Д. Из отдельной dll (DAL, Domain и т. Д.).Что бы вы вернули?

Я мог бы использовать:

SelectListItem[]

Ilist<SelectListItem>

IEnumerable<SelectListItem> 

и другие подобные объекты, но мне не нравится, как SelectListItem привязан к пространству имен System.Web.Mvc,Возможно это только я, но это только кажется немного определенным.Возможно, моя веб-форма даже не использует MVC, хотя все равно будет работать?

Ответы [ 2 ]

0 голосов
/ 30 января 2016

Я столкнулся с той же проблемой, и мое решение состояло в том, чтобы создать крошечный класс в слое служб и отобразить данные на SelectListItem s в представлении. Пример кода:

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 s можно легко сгенерировать с помощью LINQ)

Mapper.CreateMap<SelectListItemBase, SelectListItem>();

5) Наконец, код из вида

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

Это довольно сложная задача для этой простой задачи, но она позволяет желаемое разделение, а также позволяет легко сопоставлять другие свойства, если это необходимо.

0 голосов
/ 26 марта 2011

Я думаю, что вы как бы ответили на свой вопрос: неуместно возвращать SelectList из сборки, которая может использоваться приложениями, не являющимися asp.net MVC. Это даже привело бы к тому, что приложение WPF должно ссылаться на System.Web.Mvc.

Более подходящей архитектурой будет возвращение IEnumerable некоторого типа, который вы затем преобразуете в соответствующий тип элемента списка для текущего типа приложения. Это преобразование может произойти на каком-то уровне адаптера или с помощью методов расширения, если это более полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...