如何从List <string>填充Razor MVC 4列表

时间:2016-02-26 19:31:02

标签: c# asp.net-mvc twitter-bootstrap asp.net-mvc-4 razor

我有一个get属性,它返回一个字符串列表:

public List<string> CountryList 
{
    get
    {
        foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & CultureTypes.NeutralCultures))
        {
            RegionInfo ri = new RegionInfo(ci.LCID);
            CountryList.Add(ri.EnglishName);
        }

        return CountryList;
    }
}

我想创建一个bootstrap下拉框,并使用Razor引擎将其填充到此列表中。

这是我的尝试:

@Html.DropDownListFor(model => model.Country, model.CountryList, "-- Select Country --")

3 个答案:

答案 0 :(得分:0)

首先,您不希望在模型中包含代码。您应该在Controller中填充CountryList。另外,将CountryList更改为List<SelectListItem>,如下所示:

public List<SelectListItem> CountryList { get; set; }

然后,在控制器操作中填充它,如下所示:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & CultureTypes.NeutralCultures))
{
    RegionInfo ri = new RegionInfo(ci.LCID);
    CountryList.Add(new SelectListItem 
    { 
        Text = ri.EnglishName, 
        Value = ri.EnglishName
    });
}

然后,这是您在视图中的内容:

@Html.DropDownListFor(model => model.Country, model.CountryList, "-- Select Country --")

顺便提一下,我建议您使用模型中的CountryCode作为属性,而不是国家/地区名称,并更改代码以将CountryList填充到此:

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & CultureTypes.NeutralCultures))
{
    RegionInfo ri = new RegionInfo(ci.LCID);
    CountryList.Add(new SelectListItem 
    { 
        Text = ri.EnglishName, 
        Value = ri.Name
    });
}

最后,在开始编码之前,请阅读有关asp.net MVC的更多信息。

答案 1 :(得分:0)

由于您已经拥有CountryList List<string>,因此您可以在视图中执行此操作。

在你的cshtml页面中,在代码块中写下这个

 @{
   var CountryList =  Model.CountryList.Select(x=> new SelectListItem{ Text = x, Value = x}).ToList();
  } 

然后只需将您的下拉代码更改为

@Html.DropDownListFor(model => model.Country, CountryList, "-- Select Country --")

// note that we are using the newly created variable 

我知道逻辑必须在控制器端并且不要在视图中混淆,因为它是MVC的目标,这是一种解决方法,如果你根本不能回去清理你的控制器或者由于你不能采取这种方法。

答案 2 :(得分:-1)

DropdownListFor的第二个参数是IEnumerable SelectListItem,您尝试传递List个字符串。

Razor需要SelectListItem列表,因此他可以了解集合中每个对象的价值以及要显示的文字内容。

这样做对您有用:

public IEnumerable<SelectListItem> CountryList 
 {
    get
    {
        var _countryList = new List<SelectListItem>();
        foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & CultureTypes.NeutralCultures))
        {
            RegionInfo ri = new RegionInfo(ci.LCID);

            var selectListItem = new SelectListItem();
            selectListItem.Value = ci.LCID.ToString(); //Value of the object, should be unique
            selectListItem.Text = ri.EnglishName; //Text that will be displayed

            _countryList.Add(selectListItem);
        }

        return _countryList;
    }
}