在控制器中为 DropDownListFor 设置选定值在剃刀视图中不起作用

Set selected value for DropDownListFor in controller does not work in razor view

我的控制器里有这个:

[Route("Checkout")]
public ActionResult Checkout()
{
    var sb = new ShoppingBagViewModel();
    sb.DestinationCountry = "Netherlands"; // I hoped that this was sufficient
    sb.CountriesSl.Single(c => c.Text.Equals("Netherlands", StringComparison.InvariantCultureIgnoreCase)).Selected = true;
    return View(sb);
}

Visual Studio 中的快速观察确认 CountriesSl(List<SelectListItem> 类型)具有选定值。 (荷兰)

这是我的观点:

@Html.DropDownListFor(m => m.DestinationCountry, Model.CountriesSl)

DestinationCountry 在我的视图模型中也是一个字符串道具。 我知道有很多类似的问题,但我已经看了很多,但我没有看到。 我也试过:

@Html.DropDownListFor(m => Model.DestinationCountry, Model.CountriesSl)

请不要只给我答案,还要说明我的错误是什么。

编辑 以明确问题所在:我在剃须刀视图中得到一个不错的选项列表,但没有项目 "selected" 只有第一个。当我查看生成的 html 时,也没有选择的项目。

为 Ric 编辑

public List<SelectListItem> CountriesSl
{
    get
    {
        List<SelectListItem> _countries = HttpContext.Current.Cache["slCountries"] as List<SelectListItem>;
        if (_countries == null)
        {
            _countries = new List<SelectListItem>();
            foreach (string s in System.IO.File.ReadLines(System.Web.Hosting.HostingEnvironment.MapPath("~/tmpwrite/countries.csv")))
            {
                var tmp = s.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                _countries.Add(new SelectListItem() { Text = tmp[1], Value = tmp[0], Selected = false });
            }
            HttpContext.Current.Cache.Add("slCountries", _countries.OrderBy(c => c.Text).ToList(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(24, 0, 0), System.Web.Caching.CacheItemPriority.Normal, null);
        }
        return _countries;
    }
}

DropDownListFor 尝试自动匹配提供的枚举中接收 属性 的值。我一开始也有这个问题。

改为提供视图模型中的任何实体列表。我通常使用 IDictionary<int, string> 之类的东西。然后像这样创建下拉列表:

Html.DropDownListFor(m=>m.DestinationCountry, new SelectList(Model.Countries, "Key", "Value"))

然后 SelectList 将自动设置其 Key 与 DestinationCoutry 匹配的正确选项。