我在控制器中有这个:
[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;
}
}
答案 0 :(得分:-1)
DropDownListFor
尝试自动匹配提供的枚举中的接收属性的值。我一开始也遇到了这个问题。
而是在viewmodel中提供任何实体列表。我通常使用IDictionary<int, string>
之类的东西。然后像这样创建下拉列表:
Html.DropDownListFor(m=>m.DestinationCountry, new SelectList(Model.Countries, "Key", "Value"))
然后,SelectList将自动设置其Key与DestinationCoutry匹配的正确选项。