2016-04-22 4 views
2

から詳細をSelectListのを移入することができません:モデル

  • ASP.NET 4.5.2
  • MVC 5
  • ノーDB、ノーログイン、単なるフロントエンドのWeb看板。
  • カナダとアメリカのようなものが欠けていない限り、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; 

を試してみました。同じ結果 - 「あなたは駄目だよ。


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; 
    } 
    } 
} 
私は model.CountryListCountryList.getCountries()を添付しようとどこが見る

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

涙を髪に

+0

まず、それだけ '' @ Html.DropDownListFor(M => m.Country、Model.CountryList、...)である必要がある - 最初のものから2番目の同一SelectListのを作成するために、その無意味。あなたのゲッターのどのコード行がエラーを投げていますか? –

+0

---コードと私の違いがわかりません。ハイライトしてください.--- WHOOPSはそれを打ちます。長い一日だった。 –

+0

'new SelectList(Model.CountryList、....) - 既にSelectList:を使用して、ビューに2番目のドロップダウンリストを作成する必要はありません。そして、なぜあなたが 'get 'をしていないとき(' set'それだけ)、 '_CountryList'のプライベートフィールドを持っていますか? –

答えて

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

_上記の2番目のコードブロックで見ています_ _他の内部プロジェクトのコードを見て__ Uhhhh .... _私が上で行ったことを見てください_ - 非常に長い一日と言いましょう長い週、k?私は今のところ馬鹿だと思っています。 –

+0

あなたはちょうどあなたがコレクションを割り当てるコードで小さなエラーがあります。これを修正すれば、コードは正常に動作します。 – Shyju

+0

ええ、私はちょっと考え出しました。この先週はむしろ悪夢の週でした.4〜6時間の夜間の睡眠は精神的敏捷部門で私を助けてくれませんでした。上の2番目のコードブロックは、正しい方向に、お尻で私を蹴ったものです。ありがとう。 –