2012-05-07 3 views
2

В моем приложении MVC мне нужно добавить раскрывающееся меню, в котором будет отображаться список доменных имен.Выпадающее меню в MVC

У меня уже есть ViewModel, который содержит несколько свойств. Я не уверен, что последовательность шагов должна быть:

  1. Добавить новую недвижимость в мой ViewModel? Каким должен быть тип? Список?
  2. Определите метод, который заполняет указанное свойство со значениями.
  3. Используйте это свойство в поле зрения? Использовать HTML.DropdownFor?

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

EDIT: Добавлено следующее свойство к ViewModel:

public IEnumerable<SelectListItem> DomainList { get; set; } 

и реализован метод возвращает список доменов:

internal static List<Domain> FetchAllDomains() 

Далее в моем действии контроллера, у меня есть:

var domains = FetchAllDomains().Select(d => d.DomainName); 
return new EmailModel() {DomainList = domains }; 

Но я получаю следующее сообщение об ошибке:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

ответ

9

1) Add a new property to my ViewModel? What should be the type? List?

Вам нужно 2 свойства, чтобы быть более точным: IEnumerable<SelectListItem> держать все доступные опции и скалярное свойство удерживать выбранное значение

2) Define a method that populates the above property with values.

Да.

3) Use that property in the View? Use HTML.DropdownFor?

Нет, нет на вид. Представление не вызывает никаких методов. Представление работает с моделью просмотра. Контроллер должен передать правильную заполненную модель просмотра в представление.

Так, например:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Values { get; set; } 

    ... some other properties that your view might need 
} 

, а затем действие контроллера, который будет заселить этот вид модели:

public ActionResult Index() 
{ 
    var model = new MyViewModel(); 
    model.Values = new[] 
    { 
     new SelectListItem { Value = "1", Text = "item 1" }, 
     new SelectListItem { Value = "2", Text = "item 2" }, 
     new SelectListItem { Value = "3", Text = "item 3" }, 
    }; 
    return View(model); 
} 

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

@model MyViewModel 
@Html.DropDownListFor(x => x.SelectedValue, Model.Values) 

UPDATE:

В соответствии с обновленным вопросом вы имеете IEnumerable<SelectListItem> свойства на вашу модель представления, к которому вы пытаетесь присвоить значение типа IEnumerable<string>, который, очевидно, невозможно. Вы можете преобразовать это в IEnumerable<SelectListItem>, как это:

var domains = FetchAllDomains().Select(d => new SelectListItem 
{ 
    Value = d.DomainName, 
    Text = d.DomainName 
}); 
return new EmailModel { DomainList = domains }; 
+0

Я реализовал метод, который возвращает список доменных имен, таких как: var domains = FetchAllDomains(). Выберите (d => d.DomainName); return new EmailModel (кампания) {DomainList = domains}; Но я получаю сообщение об ошибке: Не могу неявно преобразовать тип 'System.Collections.Generic.IEnumerable ' в 'System.Collections.Generic.IEnumerable '. Явное преобразование существует (вы пропускаете листинг?) – dotNetNewbie

+0

Пожалуйста, обновите свой вопрос, чтобы показать полный код. Раздел комментариев должен использоваться только для комментариев, поскольку фрагменты кода не отформатированы должным образом и не читаются. –

+0

OK. Обновлено исходное сообщение – dotNetNewbie

1

После того, как у вас есть список на контроллере передать его мнению (как модели или с помощью ViewBag), а затем использовать помощника:

Html.DropDownList(
    string name, 
    IEnumerable<SelectListItem> selectList, 
    string optionLabel, 
    object htmlAttributes) 

Или (MVC 3)

@Html.DropDownListFor(model => model.Property.ID, 
    new SelectList(model.PropertyList, "ID", "Type")) 
3

Если вы не возражаете, я покажу вам пример списка экзаменов

public class SomeClass 
{ 
    //Properties 

    public int ExamId { get; set; } 
    public SelectList ExamList { get; set; } 
} 

Helper:

public static void PopulateExamList(MarkEditViewModel model, 
    List<Exam> examList) 
{ 
    model.ExamList = new SelectList(examList, "Id", "ExamName"); 
} 

Вы необходимо добавить к метокам в моем примере список всех экзаменов. После этого в View вы получите выпадающий список экзаменов
И View (Foreach каждый элемент в модели):

@Html.DropDownListFor(model => model.ExamId, 
             Model.ExamList, 
             "Choose exam") 
+0

Я пытаюсь заполнить «Тип драйвера» вниз в моем представлении драйвера. Пользователь должен иметь возможность выбирать драйвер из этого выпадающего списка при добавлении драйверов. Я попытался реализовать ваш код. Но он дает исключение для ссылки на null. В чем проблема? – JayNaz

0

В вашей ViewModel

public class ViewModelClass 
{ 
    public string DomainName { get; set; } 

    public IEnumerable<SelectListItem> DomainList 
    { 
     get 
     { 
      return GetDomainNames() //your method to get domain names 
      .Select(d => new SelectListItem() { Text = d, Value = d }); 
     } 
    } 
} 

ваш сильно типизированных

@model ViewModelClass 

@Html.DropDownListFor(model => model.DomainName, Model.DomainList) 
0
  1. Да, вам нужно имущество в вашей модели для обработки значения DropDownList
  2. Зависит, как правило, может быть целым числом, которое ссылается на значение списка DropDownlist Список, который вы собираетесь использовать для заполнения элементов, может быть определен как элемент в ViewBag или другой атрибут в вашей модели
  3. бритва Синтаксис полностью зависит из того, что вы пытаетесь достичь, вы должны использовать @Html.DropDownListFor() относится к атрибуту модели для гарантии того, что вид был stronglyTyped
0

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

public class ProductViewModel 
{ 
    public IEnumerable<SelectListItem> Items { get; set; } 
    public string SelectedItemId { get; set; } 
    //Other Properties 
} 

И в вашем Get Action метода, Верните ViewModel с данными

public ActionResult Index() 
{ 
    var objProduct = new ProductViewModel(); 
    objProduct.Items = new[] 
    { 
      new SelectListItem { Value = "1", Text = "Domain 1" }, 
      new SelectListItem { Value = "3", Text = "Domain 2" }, 
      new SelectListItem { Value = "3", Text = "Domain 3" } 
    }; 
    // can replace the above line with loading data from Data access layer. 
    return View(objProduct); 
} 

и в вашей точке зрения, которая является сильно типизированных к ProductViewModel

@model ProductViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..") 
    <input type="submit" value="save" /> 
} 

и в вашем HttpPost действий, вы будете иметь выбранное значение доступного

[HttpPost] 
public ActionResult Index(ProductViewModel model) 
{ 
// check model.SElectedItemId here 

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