2016-11-02 2 views
1

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

У меня есть в общей сложности 4 контроллера и представления, которые будут использовать это выпадающее меню. Я видел много примеров для MVC2 и MVC3, где люди жестко кодировали свои выпадающие списки в своих представлениях, и я лично не предпочитаю идти с быстрым и «грязным» исправлением, например.

У меня есть модель, содержащая следующее.

public class Status 
{ 
    public int id { get; set; } 
    public string status { get; set; } 

    public Status(int statusId, string statusName) 
    { 
     id = statusId; 
     status = statusName; 
    } 
} 

Статус должен быть в состоянии иметь любой из 3-х возможных значений:

Active 
Inactive 
Processing 

Я думал о создании статуса с помощью этого метода я в настоящее время имею в своем классе статуса:

public static List<Status> getAllStatus() 
    { 
     List<Status> states = new List<Status>(); 
     states.Add(new Status(1, "Active")); 
     states.Add(new Status(2, "Inactive")); 
     states.Add(new Status(3, "Processing")); 
     return states; 
    } 

Мне не удалось выяснить, как использовать эту модель внутри моих контроллеров наряду с тем, как передать ее моим взглядам, и надеялся, что кто-то здесь узнает, как это сделать?

EDIT1:

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

EDIT2:

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

public int CustomerID { get; set } 
public string Email { get; set } 
public string Phone { get; set } 
public Status Status { get; set; } 

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

Таким образом, я не хочу изменять следующее выпадающее меню с помощью 3 опций, Inactive, Active и Processing.

enter image description here

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

+0

ли возможность использовать перечисление вместо класса, которые держат идентификатор + имя? В этом случае у вас есть EnumDropDownListFor –

+0

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

+0

Речь идет о вашем контроллере, а не о вашем представлении. Вам это нужно как строка? Используйте .ToString(), когда вы передаете свой объект ViewModel свойству Model (или атрибуту, если он не является допустимым идентификатором ...) –

ответ

1
@Html.DropDownListFor(m => m.status_id, new SelectList(getAllStatus(), "id", "status")) 
+0

Я думаю, я забыл упомянуть, что я буду хранить выбранное значение в виде строки в моей базе данных и что я использую представление, которое не имеет модели моего класса статуса, а скорее модель объекта, которую я буду хранить в моей базе данных. – Zeliax

+0

Я думаю, что мы не можем обойтись без статуса класса, потому что параметры поступали из базы данных. –

+0

Это не так. Я хочу, чтобы значения были «жестко закодированы» и не сохранялись в базе данных, но я хочу сохранить выбранную опцию в качестве строки в моей базе данных для объекта, который я сохраняю. – Zeliax

-1

Вы могли бы объявить государства как общественное Собственость в своем классе и использовать это, чтобы получить доступ к нему в ваших просмотрах:

<ComboBox Grid.Column="1" Grid.Row="0" Margin="5" 
    VerticalAlignment="Center" ItemsSource="{Binding States}"  
    IsTabStop="False"}"/> 
+0

спасибо :) Как вы отформатировали его, так что код появится? – SomeOneYouWillNeverKnow

+2

Этот вопрос касается ASP.NET MVC, а не WPF. Пожалуйста, просмотрите теги под вопросом. :) – CodeCaster

1

Надеется, что это полезно. Итак, чтобы у вас было много вопросов о ваге. Будьте более конкретными, если вы можете. Если вы не знаете, как работает MVC, я бы посоветовал следовать некоторым учебникам по этому вопросу.

Model.cs (Предпочитает ViewModel). Вы должны создать ViewModel, который u переходит к представлению. Ниже приведен пример получения списка элементов.

public int SelectedStatusId { get; set; } 

    [DisplayName("Status")] 
    public IEnumerable<SelectListItem> StatusItems 
    { 
     get 
     { 
      yield return new SelectListItem { Value = "", Text = "- Select a status -" }; 
      StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum)); 

      foreach (StatusTypeEnum item in values) 
      { 
       if (item != StatusTypeEnum.Unknown) 
       { 
        yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() }; 
       } 
      } 

     } 
    } 

StatusTypeEnum.CS

public enum StatusTypeEnum() 
    { 
     [Description("Active")] // For correct naming 
     Active, 
     Inactive, 
     Processing 
    } 

View.cshtml

@Html.DropDownListFor(x => Model.SelectedStatusId, Model.StatusItems) 

EnumAttribute.cs (Чтобы прочитать аннотацию Описания. И не пытайтесь понять это. Это просто волшебство. Он получает DataAnnotation типов перечислений отражением.)

public static class EnumAttribute 
    {   
    public static string GetDescription<TEnum>(this TEnum value) 
    { 
     var fi = value.GetType().GetField(value.ToString()); 

     if (fi != null) 
     { 
      var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

      if (attributes.Length > 0) 
      { 
       return attributes[0].Description; 
      } 
     } 

     return value.ToString(); 
    } 
} 

Привет,

С.

+0

Я постарался быть более конкретным в моем вопросе. Пожалуйста, прочитайте мое редактирование: P – Zeliax

1

Не имеет смысла сохранять его в виде строки в вашей базе данных, поскольку она звучит скорее как нечто статическое. Поэтому вы должны рассмотреть Enum. Для меня более точный взгляд на мой предыдущий ответ и добавление этих свойств модели в ViewModel.

 public class CustomerViewModel() { 
      public int SelectedStatusId { get; set; } 

[DisplayName("Status")] 
public IEnumerable<SelectListItem> StatusItems 
{ 
    get 
    { 
     yield return new SelectListItem { Value = "", Text = "- Select a status -" }; 
     StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum)); 

     foreach (StatusTypeEnum item in values) 
     { 
      if (item != StatusTypeEnum.Unknown) 
      { 
       yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() }; 
      } 
     } 
    } 
} 


} 

Pass это в ваш взгляд через контроллер:

public class CustomerCOntroller(){ 
     public ActionResult Index(){ 
       CustomerViewModel viewModel = new CustomerViewModel(); 
       return View(viewModel); 
     }  
    } 

И вы сделали. Если u больше работает со списком, который вам нужно создать, добавьте его в свой объект viewModel.

Привет,

S ..

Смежные вопросы