填充@ Html.DropDownListFor - 来自硬编码值的OK,来自数据库的错误

时间:2013-12-17 17:28:35

标签: c# asp.net-mvc linq list asp.net-mvc-4

我们正在填写表单中的下拉列表,这些列表是用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。”这就是下面推荐的演员阵容越少。

1 个答案:

答案 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)......