2016-04-22 3 views
2

Детали:Не удалось заполнить SelectList от модели

  • ASP.NET 4.5.2
  • MVC 5
  • Нет БД, нет входа в систему, просто передний конец веб-щит.
  • Нет необходимости в 100% точном списке стран, если такие вещи, как Канада и США, отсутствуют, это достаточно хорошо.

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

Моя модель:

[DisplayName("Country")] 
public string Country { get; set; } 
private IEnumerable<SelectListItem> _CountryList; 
public IEnumerable<SelectListItem> CountryList { 
    get { 
    List<string> CultureList = new List<string>(); 
    CultureInfo[] getCultureInfo = CultureInfo.GetCultures(CultureTypes.SpecificCultures); 
    foreach(CultureInfo getCulture in getCultureInfo) { 
     RegionInfo GetRegionInfo = new RegionInfo(getCulture.LCID); 
     if(!CultureList.Contains(GetRegionInfo.EnglishName)) { 
     CultureList.Add(GetRegionInfo.EnglishName); 
     } 
    } 
    return CultureList.OrderBy(x => x.ToString()).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() }).ToList(); 
    } 
    set { _CountryList = value; } 
} 

Мой Вид:

@Html.DropDownListFor(model => model.Country, new SelectList(Model.CountryList, "Value", "Text"), " « ‹ Choose your country › » ", htmlAttributes: new { @class = "form-control" }) 

Сообщение об ошибке, возвращается это все приводит в бешенство,

System.NullReferenceException: Object reference not set to an instance of an object. 

Какой код, «Вы f ** ked up, и удачи, выясняя, что это, потому что я не говорю ».

Я зашел так далеко, чтобы попытаться вручную заполнить модель вручную выбранным списком выбора, до нулевого эффекта. Где я здесь не так?


EDIT 1:

я сейчас попробовал,

RegionInfo country = new RegionInfo(new CultureInfo("en-US", false).LCID); 
List<SelectListItem> countryNames = new List<SelectListItem>(); 

//To get the Country Names from the CultureInfo installed in windows 
foreach(CultureInfo cul in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) { 
    country = new RegionInfo(new CultureInfo(cul.Name, false).LCID); 
    countryNames.Add(new SelectListItem() { Text = country.DisplayName, Value = country.DisplayName }); 
} 

//Assigning all Country names to IEnumerable 
IEnumerable<SelectListItem> nameAdded = countryNames.GroupBy(x => x.Text).Select(x => x.FirstOrDefault()).ToList().OrderBy(x => x.Text); 
return nameAdded; 

с нулевым успехом. Те же результаты - «u dun goofed».


EDIT 2:

Модель:

[DisplayName("Country:")] 
public string Country { get; set; } 
public IEnumerable<SelectListItem> CountryList { get; set; } 

Вид:

@Html.DropDownListFor(model => model.Country, Model.CountryList, " « ‹ Choose your country › » ", htmlAttributes: new { @class = "form-control" }) 

Контроллер:

namespace Project.Controllers { 
    public class HomeController : Controller { 
    public ActionResult Index() { 
     return View(); 
    } 

    public ActionResult Demo() { 
     var model = new DemoViewModel() { 
     model.CountryList = CountryList.getCountries() 
     }; 
     return View(model); 
    } 
    } 
//dummy content, just to try to "populate" ****ANYTHING**** 
    public class CountryList { 
    public static IEnumerable<SelectListItem> getCountries() { 
     IList<SelectListItem> items = new List<SelectListItem> { 
     new SelectListItem{Text = "United States", Value = "B"}, 
     new SelectListItem{Text = "Canada", Value = "B"}, 
     new SelectListItem{Text = "United Kingdom", Value = "B"}, 
     new SelectListItem{Text = "Texas", Value = "B"}, 
     new SelectListItem{Text = "Washington", Value = "B"} 
     }; 
     return items; 
    } 
    } 
} 

Вы видите, где я пытаюсь прикрепить CountryList.getCountries() к model.CountryList:

Cannot initialize 'DemoViewModel' with a collection initializer because it does not implement 'System.Collections.IEnumerable' 

слезы из волосы

+0

Во-первых, он просто должен быть '@ Html.DropDownListFor (м => m.Country, Model.CountryList, ...)' - его бессмысленно создать 2-й идентичную SelectList от первого. Какая строка кода в вашем получателе выдает ошибку? –

+0

--- Я не вижу разницы между вашим кодом и моим. Пожалуйста, выделите .--- WHOOPS нанесите удар. Это был долгий день. –

+0

Вам не нужно создавать второй раскрывающийся список в представлении, используя 'new SelectList (Model.CountryList, ....)' - его уже SelectList :). И почему у вас есть личное поле для '_CountryList', когда вы никогда не« получаете »его (только« set' it)? –

ответ

3

Предполагая, что CountryList.getCountries() возвращает коллекцию SelectListItem,

ли либо

var model = new DemoViewModel(); 
model.CountryList = CountryList.getCountries(); 
return View(model); 

Здесь вы делаете объект DemoviewModel и без каких-либо проблем устанавливаете свойство CountryList.

этого

var model = new DemoViewModel { 
            CountryList = CountryList.getCountries() 
           }; 
return View(model); 

Это называется инициализации объекта . Здесь вы создаете объект и инициализируете значение свойства CountryList вместе с этим.

Предполагая, что вашему классу DemoViewModel принадлежит другое свойство для хранения выбранного элемента.

public class DemoViewModel 
{ 
    public List<SelectListItem> CountryList { set;get;} 
    public string Country { set;get;} 
} 

Теперь на ваш взгляд, который сильно типизированных с этой точки зрения модели, вы используете вспомогательный метод DropDownListFor.

@model DemoViewModel 
@using(Html.BeginForm()) 
{ 
    @Html.DropDownListFor(s=>s.Country,Model.CountryList) 
    <input type="submit" /> 
} 
+0

_ Посмотрите на второй блок кода выше_ - _ Смотрит на код из других внутренних проектов_ - Uhhhh .... смотрит на то, что я сделал выше_ - Давайте просто назовем это очень длинным днем ​​в конце очень длинная неделя, k? Сейчас я чувствую себя довольно глупо. –

+0

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

+0

Да, я так понял. На прошлой неделе это была довольно кошмарная неделя, а 4-6 часов сна в ночное время не помогали мне в отделении умственной ловкости. Спасибо, второй кодовый блок выше, что меня ударило в задницу в правильном направлении, спасибо. –

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