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

时间:2017-03-01 13:09:50

标签: c# asp.net-mvc razor asp.net-mvc-5.2

我在控制器中有这个:

[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也是我的viewmodel中的字符串道具。 我知道有很多类似的问题,但我看了很多,我只是看不到它。 我也尝试过:

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

请不要只给我答案,还要解释我的错误。

编辑以明确问题所在:我在剃刀视图中获得了一个不错的选项列表,但没有项目&#34;已选中&#34;只是第一个。当我查看生成的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;
    }
}

1 个答案:

答案 0 :(得分:-1)

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

而是在viewmodel中提供任何实体列表。我通常使用IDictionary<int, string>之类的东西。然后像这样创建下拉列表:

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

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