我们正在填写表单中的下拉列表,这些列表是用C#ASP.NET MVC 4(有时是5)构建的。感谢SOF,我建立了一个临时列表:
/// <summary>
/// Generate a list of countries.
/// </summary>
/// <returns>List(SelectListItem)</returns>
/// <remarks>Values are from ISO 3166-1 alpha-3</remarks>
public static List<SelectListItem> Countries()
{
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "United States of America", Value = "USA", Selected = true });
items.Add(new SelectListItem { Text = "Australia", Value = "AUS" });
items.Add(new SelectListItem { Text = "Canada", Value = "CAN" });
items.Add(new SelectListItem { Text = "Mexico", Value = "MEX" });
items.Add(new SelectListItem { Text = "United Kingdom", Value = "GBR" });
return items;
}
然后将其传递给ViewBag:
ViewBag.CountryList = SelectLists.Countries();
并将其渲染为:
@Html.DropDownListFor( model=>model.country_code,
(List<SelectListItem>)ViewBag.CountryList )
这一部分都运转得很好。
现在团队正在实现代码来从数据库而不是从模拟数据中检索查找,事情并不顺利。我们的业务对象方法接受查找类型,在本例中为“Country”,并应返回List<SelectListItem>
:
控制器:
List<SelectListItem> countryList = GetLookupData( "Country" );
ViewBag.CountryList = countryList;
型号:
public static List<SelectListItem> GetLookupData(string lookupType)
{
MPPEntities dbContext = new MPPEntities();
var query = (from c in dbContext.SystemLookups
where c.lookup_type == lookupType
orderby c.order_by
select new SelectListItem { Text = c.name, Value = c.value })
.ToList<SelectListItem>();
return (List<SelectListItem>)query;
}
在我们调试LINQ时,query
包含正确的数据。但是当调试器返回到控制器时,countryList
将失败,因为“无法计算表达式”。当然,视图本身也会失败。
基于模拟列表工作的观察结果以及真实列表包含正确数据,我推断故障点在于从通用集合到List<SelectListItem>
的转换。转换列表类型的正确方法是什么?
ETA:CSHTML文件中的错误是: “用户代码未处理RuntimeBinderInternalCompilerException。”这就是下面推荐的演员阵容越少。
答案 0 :(得分:2)
你似乎制造了许多无用的铸件......
你能试试吗
public static List<SelectListItem> GetLookupData(string lookupType)
{
MPPEntities dbContext = new MPPEntities();
return (from c in dbContext.SystemLookups
where c.lookup_type == lookupType
orderby c.order_by
select new SelectListItem { Text = c.name, Value = c.value })
.ToList();
}
你能否在你看来尝试
@{
var contryCodes = (IEnumerable<SelectListItem>)ViewBag.CountryList;
}
@Html.DropDownListFor( model=>model.country_code,
countryCodes )
因为它看起来像动态问题(ViewBag)......