Каков наилучший способ определить параметры выбора / выпадающего для создания представления или хранилища БД - PullRequest
6 голосов
/ 13 марта 2012

Я до сих пор не уверен в том, как лучше сохранить параметры списка выбора для внешнего интерфейса или для хранения в БД.

В настоящее время я использую Enums, а также использую декораторы описания ( Как создать раскрывающийся список из enum в ASP.NET MVC? )

Теперь я думаю, что я мог бы просто создать полный класс для этого материала, чтобы я мог правильно хранить следующую информацию с полным контролем:

  1. Наименование товара
  2. Полное описание
  3. int для хранения в дБ
  4. заказ
  5. Любые способы получить информацию в любом случае из списка.

Правильно ли мне думать о том, чтобы реализовать все это вручную? Я хочу действительно надежный способ сделать это, и enum на самом деле не чувствует, что собирается его сократить.

Ответы [ 5 ]

4 голосов
/ 27 марта 2012

Правильно ли я должен подумать о том, чтобы реализовать все это сам рука

Да. Перечисления часто с утечками и недостаточными абстракциями , которые не всегда подходят для сложной модели предметной области, которую вы на самом деле хотите представить.

Вместо того, чтобы бросать свой собственный, вы можете рассмотреть класс перечисления Headspring (через github , nuget ). Мы используем его все время вместо перечислений, потому что он почти такой же простой и гораздо более гибкий.

Пример перечисления "State" и использования его в качестве списка выбора:

public class State : Enumeration<State>
{
    public static State Alabama = new State(1, "AL", "Alabama");
    public static State Alaska = new State(2, "AK", "Alaska");
    // .. many more
    public static State Wyoming = new State(3, "WY", "Wyoming");

    public State(int value, string displayName, string description) : base(value, displayName)
    {
        Description = description;
    }

    public string Description { get; private set; }
}

public IEnumerable<SelectListItem> Creating_a_select_list(State selected)
{
    return State.GetAll().Select(
        x => new SelectListItem
        {
            Selected = x == selected,
            Text = x.Description,
            Value = x.Value.ToString()
        });
}

Я не пытаюсь продать вам эту конкретную реализацию, вы наверняка могли бы написать свой собственный код (класс Enumeration составляет всего около 100 строк кода). Но я определенно думаю, что вы выиграете, выйдя за рамки базовых перечислений. Это правильный подход, учитывая сценарий, который вы описали в своем вопросе.

3 голосов
/ 22 марта 2012

Первое место, где должна храниться такая информация, - это база данных ... или любой "виртуальный магазин", такой как веб-сервис, который предлагает интерфейс для вас, БД.Фактически, если есть другие базы данных, которые используют эти значения, ОНИ ДОЛЖНЫ быть представлены в базе данных, иначе вы столкнетесь с большими проблемами.Фактически, предположим, что одно из таких значений является строкой .... если вы не определите таблицу, содержащую все возможные значения + ключ, и просто напишите строку, как в других таблицах ... это будет невозможно для васизменить формат строки, так как она будет «распространяться» по всей вашей базе данных ... Наоборот, если вы просто используете внешний ключ для ссылки на такие строки ... вы можете легко изменить их, так как строка хранитсятолько в одном месте в вашей БД.Кроме того, решение перечисления страдает от проблемы, заключающейся в том, что вы не можете добавлять или удалять значения ... поэтому, если такие операции «концептуально» могут иметь смысл, вы не можете использовать перечисление.Вы можете использовать перечисление, когда все параметры «концептуально» охватывают все возможности, поэтому вы уверены, что никогда не добавите / не удалите другие параметры, например, в случае перечисления (да, нет, неизвестно).

Тем не менее, как только у вас есть опции в БД, все остальное просто ... у вас будут DTO-сущности или бизнес-сущности, представляющие их точно так же, как и для всех других сущностей БД.

Для целей визуализации у вас может быть версия этих параметров ViewModel, которая может просто содержать ключ и описание, и «метод репозитория», который могут вызывать ваши контроллеры для получения списка всех параметров.

После полученияВы, контроллеры, помещаете их в общую страницу ViewViewModel ... вместе со всей другой информацией, которая будет отображаться на странице.Из ViewModel ... вы можете получить к ним доступ, чтобы поместить их в выпадающий список.

Подведение итогов: 1) Вам нужно представление параметров в БД 2) Затем у вас будет DTO, бизнес-уровень и версии View.этих сущностей ... по мере необходимости, точно так же, как и для всех других сущностей БД.

2 голосов
/ 22 марта 2012

Вы ищете универсальное решение для всех вариантов списка?Я лично рекомендую выбрать вариант, который лучше всего подходит для конкретной проблемы.

В недавнем проекте я познакомился с гибридом Smart Enum .Вот пример (я прошу прощения за опечатки, я набираю это холодно):

public class Priority 
{
    public enum Types
    {
        High,
        Medium,
        Low
    }

    public Types Type { get; private set; }
    public string Name { get { return this.Type.ToString(); } } // ToString() with no arguments is not deprecated
    public string Description { get; private set; }

    public static High = new Priority{ Type = Types.High, Description = "..."};
    public static Medium = new Priority{ Type = Types.Medium, Description = "..."};
    public static Low = new Priority{ Type = Types.Low, Description = "..."};

    public static IEnumerable<Priority> All = new[]{High, Medium, Low};

    public static Priority For(Types priorityType)
    {
        return All.Single(x => x.Type == priorityType);
    }
}

Итак, при реализации вы можете сохранить значение Enum, но вы будете ссылаться на сам объект (Priority.For (entity.priority)) для дополнительных метаданных при рендеринге ваших представлений.

Это ближе к тому, что вы ищете?

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

1 голос
/ 23 марта 2012

Я храню свои параметры в самих моделях просмотра:

public class ViewModel {

    [Required]
    public int SelectListValue { get; set; }

    public IDictionary<String,String> SelectListOptions { 
        get { 
            return new Dictionary<String, String>{
                                                    { "0", Resources.Option1},
                                                    { "1", Resources.Option2},
                                                    { "2", Resources.Option3}
                                                 }; 
        } 
    }

}

Тогда я могу просто вставить следующую строку в мое представление, чтобы отобразить список выбора:

<%= Html.DropDownListFor(m => m.SelectListValue, new SelectList(this.Model.SelectListOptions, "Key", "Value", "")) %>
1 голос
/ 13 марта 2012

Вы можете использовать «шаблон хранилища» для доступа к данным и использовать модели представления между вашими контроллерами и представлениями. Пример:

//Model
public class CustomerViewModel
{
    public Customer customer { get;set; }        
    public IEnumerable<Village> Villages { get; set; }
}

//Controller
public ActionResult Index()
{
    var customerViewModel = new CustomerViewModel
                           {
                               Customer = new Customer(),
                               Villages = _villageService.GetAll()
                           };
    return View(customerViewModel);
}

//View
@model ViewModel.RegisterViewModel
@Html.DropDownListFor(q => q.Customer.VillageId, new SelectList(Model.Villages, "Id", "Title"), "Please Select")

Я написал сообщение в блоге о шаблоне хранилища, вы можете посмотреть.

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