无法填充控制器代码中的选择列表 - C#MVC

时间:2014-02-25 14:21:05

标签: c# asp.net asp.net-mvc asp.net-mvc-4 viewmodel

我有一个相当直接的要求 - 填充一个视图模型,它有一个SelectList作为其属性之一 - NewOccs在模型上定义为:

   public class RatesList
   {
    [Key]
    public long TypeID { get; set; }
    public string TypeName { get; set; }
    public int TypeCount { get; set; }
    public IEnumerable<SelectListItem> NewOccs { get; set; }
   }

我填充它的控制器代码是:

   var rooms = dbt.Rooms.Where(r => r.hotel_id == AccID)
               .GroupBy(p => p.RoomTypes).Select(g => new RatesList
                {
                    TypeName = g.Key.type_name,
                    TypeCount = g.Count(),
                    NewOccs = dbt.Rates.Where(rt => rt.type_id == g.Key.type_id).GroupBy(rt => rt.occ).AsEnumerable()
                       .Select(proj => new SelectListItem
                       {
                           Text = proj.Key,
                           Value =proj.Key
                       })

                }).ToList();

应从其获取信息的费率表是:

public class Rates
{
    public int id { get; set; }
    public long type_id { get; set; }
    public DateTime ratedate { get; set; }
    public decimal rate { get; set; }
    public string occ { get; set; }
}

如何访问我的费率表中的任何其他字段 - 当我填充SelectList时?例如,在VSExpressIDE中,intellisense只允许我键入proj.Key - 其他属性不存在。我希望occ成为键/值,我希望文本是occrate的串联 - 即:

Text = proj.occ + ' ' + rate.ToString() 

...但在intellisense中找不到rateocc

谢谢Mark,

2 个答案:

答案 0 :(得分:2)

如果您单步执行调试器,则会看到GroupBy()提供GroupedEnumerable,其中包含密钥。密钥是Lookup<string, Rates>,因为您在字符串上使用了GroupBy。

如果您将Select更改为SelectMany,则会看到所有费率。但那会破坏GroupBy的目的。我最终并不完全确定你想要什么,但here是GroupBy的好指南

答案 1 :(得分:1)

像这样:

public class Client
{
    public int SelectedSexId { get; set; }
    public IList<Sex> SexList { get; set; }
    public IList<SelectListItem> SexListSelectListItems
    {
        get
        {
            SexList=SexList??new List<Sex>();
            var list = (from item in SexList
                        select new SelectListItem()
                        {
                            Text = item.Name,
                            Value = item.Id.ToString(CultureInfo.InvariantCulture)
                        }).ToList();
            return list;
        }
        set { }
    }
}