C# 如何从列表

C# 如何从列表,c#,asp.net-mvc,twitter-bootstrap,asp.net-mvc-4,razor,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(c

我有一个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;
    }
}

首先,您不希望在模型中包含代码。您应该在控制器中填充CountryList。另外,将您的CountryList更改为如下列表:

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作为属性,而不是country name,并将代码更改为填充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的更多信息。

DropdownListFor的第二个参数是SelectListItem的IEnumerable,您正在尝试传递字符串列表

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;
    }
}
因为您已经有了一个CountryList,它是一个列表,所以您可以在视图中简单地执行此操作

在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的目标,如果您根本无法回去清理控制器或出现其他问题而无法采取这种方法,这是一种解决方法。

阅读asp.net MVC教程,了解如何执行该操作。@ataravati我曾经尝试过,而且我确实尝试过很多方法,但它们与我无关。我需要一些帮助。在模型中填充列表不是好的做法。列表应该从模型外部的控制器填充。由于CountryList已经是IEnumerable,因此从第一个IEnumerable创建另一个相同的IEnumerable是没有意义的额外开销-它只是@Html.DropDownListForm=>m.Country,model.CountryList,-选择国家-哦,对不起!那是个错误。我修好了。谢谢,这太好了。是的,我今天将阅读更多关于MVC的内容。@ataravati我在将列表从控制器传递到视图时遇到问题,我无法从我的模型中获取它
@Html.DropDownListFor(model => model.Country, CountryList, "-- Select Country --")

// note that we are using the newly created variable