2013-10-02 4 views
4

Я пытаюсь создать выпадающий список с одним вызовом базы данных.ASP.NET привязка результатов запроса linq к HTML.DropDownList() с использованием MVC

Моя таблица состоит из столбца Id и столбца CompanyName. Мне нужно отобразить имя_компьютера для пользователя, и когда выбрано одно из них, для идентификатора для Id указывается идентификатор.

я поставил простую модель вместе, чтобы хранить информацию:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 

namespace Portal.Models 
{ 
    public class CompanyListId 
    { 
     public int Id { get; set; } 
     public string CompanyName { get; set; } 
    } 

    public class CompanyListIdDBContext : DbContext 
    { 
     public DbSet<CompanyListId> Contacts { get; set; } 
    } 
} 

Но у меня возникли проблемы с контроллером и бритвой вызова в представлении.

Мой контроллер:

public void CompanyListIdSearch() 
     { 
      using (var dc = new CompanyListIdDBContext()) 
      { 
       var content = from p in db.Companies 
           select new { p.CoId, p.CompanyName }; 
      } 
     } 

Бритва звонок в Вид:

<div id="partners" class="linen"> 

         @{Html.DropDownList("CompanyListIdSearch", new SelectList(Model.CompanyName));} 
        </div> 

Схватив модель на вершине зрения @model Portal.Models.CompanyListId

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

Я получаю эту ошибку:

The model item passed into the dictionary is of type 'Portal.Models.DashboardContents', but this dictionary requires a model item of type 'Portal.Models.CompanyListId'. 
+0

Viewbag works. Использование ViewModels - это еще один вариант. [Просмотр моделей] (http://blogs.msdn.com/b/simonince/archive/2010/01/26/view-models-in-asp-net-mvc.aspx) –

ответ

3

Не совсем. Вы не можете вызвать метод в DropDownList.

Во-первых, поставить эту коллекцию предметов в вашем ViewBag:

using (var dc = new CompanyListIdDBContext()) 
{ 
    var content = from p in db.Companies 
     select new { p.CoId, p.CompanyName }; 

    ViewBag.CompaniesList = content 
     .Select(c => new SelectListItem 
     { 
      Text = c.CompanyName, 
      Value = c.CoId.ToString() 
     }).ToList(); 
} 

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

Наконец, просто использовать свойство модели и переключатель DropDownListFor:

@Html.DropDownListFor(m => m.Id, ViewBag.CompaniesList); 

Лучший подход, однако, чтобы не использовать ViewBag и использовать модель представления вместо этого. Что-то вроде этого:

public class CompanyViewModel 
{ 
    public int Id { get; set; } 
    public string CompanyName { get; set; } 
    public List<SelectListItem> CompaniesList { get; set; } 
} 

Тогда ваш метод действия будет что-то вроде:

public ActionResult YourAction() 
{ 
    var model = new CompanyViewModel(); 

    using (var dc = new CompanyListIdDBContext()) 
    { 
     var content = from p in db.Companies 
      select new { p.CoId, p.CompanyName }; 

     model.CompaniesList = content 
      .Select(c => new SelectListItem 
      { 
       Text = c.CompanyName, 
       Value = c.CoId.ToString() 
      }).ToList(); 
    } 

    return View(model); 
} 

Тогда ваш взгляд будет использовать новую модель:

@model CompanyViewModel 

Тогда ваш выпадающий будет:

@Html.DropDownListFor(m => m.Id, Model.CompaniesList) 
+0

Является ViewModel принципиально отличным от обычного Модель? Могу ли я повторно использовать то, что у меня есть? Или функция ViewModel позволяет мне подталкивать данные модели к отдельному объекту специально для представлений? –

+2

@ZachM.Это в основном представление вашей модели, созданной для целей отображения/редактирования. Это означает, что вам также не нужно подвергать классы модели классу (особенно, если они используются как классы EF/ORM). – mattytommo

+0

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что coid является целым числом, а элементы списка выбора не нравятся. –

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