2010-09-02 3 views
1

Мне удалось создать раскрывающийся список для моего проекта MVC, но значение не выбрано в качестве выбранного значения в раскрывающемся списке. Он просто показывает полный список граф из первого. Значение - из базы данных. Я попытался найти его с предыдущего поста, но это было довольно запутанно. Пожалуйста, предложите мне любую идею.ASP.Net MVC DropdownList и выбранное значение

Controller Код

public ActionResult Edit(int i) 
{ 
    var items = new SelectList(db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM"); 
    ViewData["MST_COUNTRies"] = items; 
} 

View Code

<%= Html.DropDownList("COUNTRY_ID", (SelectList)ViewData["MST_COUNTRies"])%> 
+0

Возможный дубликат: http://stackoverflow.com/questions/624828/asp-net-mvc-html-dropdownlist-selectedvalue – Gabe

ответ

6

Я бы предложил вам использовать строго типизированные виды (не нужно ViewData и магические строки). не Как всегда начинается с определения вашего вида модели класса:

public class CountriesViewModel 
{ 
    public int? SelectedCountryId { get; set; } 
    public IEnumerable<SelectListItem> Countries { get; set; } 
} 

Затем контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index(int? id) 
    { 
     // TODO: Fetch those from your DB 
     var countries = new[] 
     { 
      new { Id = 1, Name = "Country 1" }, 
      new { Id = 2, Name = "Country 2" }, 
     }; 

     var model = new CountriesViewModel 
     { 
      Countries = new SelectList(countries, "Id", "Name", id) 
     }; 

     return View(model); 
    } 
} 

И, наконец, ваш сильно типизированной:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.CountriesViewModel>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <%= Html.DropDownListFor(
      x => x.SelectedCountryId, 
      Model.Countries, 
      "-- Select Country --") 
    %> 

</asp:Content> 

Теперь, когда вы звоните /home/index вы получаете не выбрана страна, но когда вы передаете id этому действию, например /home/index/2, вы получаете страну с выбранным идентификатором.

Примечание: Если вы используете ASP.NET MVC 1.0 не будет иметь сильно типизированных помощника DropDownListFor, и вы могли бы использовать это вместо того, чтобы:

<%= Html.DropDownList(
     "SelectedCountryId", 
     Model.Countries, 
     "-- Select Country --") 
%> 
+0

«TODO: извлеките данные из вашей базы данных» Как получить данные из этого списка? новый SelectList (db.MST_COUNTRIES.ToList(), "COUNTRY_ID", "COUNTRY_NM"); " – Hoorayo

+0

Yeap, это может сработать. Конечно, вы не должны забывать последний параметр, db.MST_COUNTRIES.ToList(), «COUNTRY_ID», «COUNTRY_NM», id); 'Также вам следует избегать доступа к базе данных непосредственно с вашего контроллера, но абстрагировать ее в репозиторий, чтобы вы могли легко изолировать ваши контроллеры изолированно. Но это не связано с вашим вопросом, это просто хорошая практика. –

1

Попробуйте что-то вроде этого:

public ActionResult Edit(int i) 
{ 
    var items = new SelectList(db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM", yourSelectedCountryId); 
    ViewData["COUNTRY_ID"] = items; 
} 

Затем на ваш взгляд:

<%= Html.DropDownList("COUNTRY_ID"); %> 

Некоторые примечания:

  • «yourSelectedCountryId» аргумент в новом SelectList() может быть использована для определения элемента, который должен быть изначально выбран. Предполагая, что COUNTRY_ID является int, этот аргумент также должен быть int.
  • Если вы заполняете ViewData с помощью IEnumerable, который соответствует имени/id DropDownList, вызов Html.DropDownList() автоматически находит его и использует. Вот почему я изменил ViewData ["MST_COUNTRIES"] на ViewData ["COUNTRY_ID"]. Он сохраняет небольшой код, и я заставил использовать этот подход для работы с ошибкой в ​​MVC v1.
+0

Я изменил их, но все равно произошло то же самое. Значение из базы данных не выбрано в раскрывающемся списке. Я использую ViewModel как «return View (новый EducationViewModel (empEducation))». Как вы думаете, это может быть причиной? – Hoorayo

+0

Да, ViewModel может повлиять на него. Имеет ли EducationViewModel также поле под названием COUNTRY_ID? Если это так, его значение COUNTRY_ID может переопределить значение по умолчанию из нового вызова SelectList(), и вам нужно будет установить его в значение базы данных для моего подхода к работе. Кроме того, убедитесь, что значение базы данных является фактическим идентификатором страны, а не именем страны, объектом типа MST_COUNTRY и т. Д. Это должен быть идентификатор, который будет соответствовать свойству COUNTRY_ID стран, которые вы передаете в SelectList. –

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