将值列表放入ASP.Net MVC中的viewmodel中

时间:2012-08-07 11:42:56

标签: asp.net asp.net-mvc asp.net-mvc-3 linq

我让自己完全糊涂了,如果有人能再指出我正确的方向,我会很感激。

我正在尝试将一个搜索表单添加到一个虚构的项目中,以用于我自己的学习目的。

理念是 - 我有一个日期文本框,并且有几天雇用文本框 - 当搜索被点击时 - 代码应该查找在输入日期和日期加上数量之间预订的所有汽车需要几天的工作。 (A)

这将生成一个必须从搜索的下一部分(B)中排除的汽车列表

然后搜索Cars(C),并排除在(B)

生成的列表

然后Linq填充ct对象(D)freeCarTypes。

此时

freeCarTypes,正确保存我正在寻找的数据 - 列表:

Car Type (TypeNme)
Type ID
TypeCount (how many of this car type are available)
NumSelected (set to 0 by default)

NumSelected(我希望)将在模型中填充,当我列出每种车型时,使用TypeCount(可用)的下拉列表 - 然后填充模型的NumSelected部分。因此,当帖子发生时,我有一个汽车类型列表,以及经销商感兴趣的每种类型的数量。

我的问题是,如何将汽车列表 - freeCarTypes(D) - 放入我的SearchViewModel.TypesAvail?

使用IQueryable的我的SearchViewModel是错误的,还是我应该在这里使用别的东西 - 我会围成一圈。

感谢您的帮助,

标记

public class SearchViewModel
{
    [Required]
    public DateTime From { get; set; }
    [Required]
    public int Days { get; set; }
    public long DealerID { get; set; }
    public IQueryable<Car> Cars { get; set; }
    public IQueryable<TypesAvail> TypesAvails { get; set; }
}

    public class TypesAvail
{
        public String TypeNme { get; set; }
        public long TypeID { get; set; }
        public int TypeCount { get; set; }
        public int NumSelected { get; set; }
}

我的SearchController

   [HttpPost]
    public ActionResult Avail(SearchViewModel model, string id)
    {
        if (ModelState.IsValid)
        {

            // (A)
            var dteFrom = model.From;
            var dteTo = model.From.AddDays(model.Nights);

            // (B)
            var prebookedCars = db.Cars
                .Where(car => car.Rentals.Any(rental =>
                    (model.DealerID == rental.Dealer_id) && (
                    (dteFrom >= rental.dateout && dteFrom < rental.dateback)
                    ||
                    (dteTo > rental.dateout && dteTo <= rental.dateback)
                    ||
                    (dteFrom <= rental.dateout && dteTo >= rental.dateback)
                )));


                // (C)
            var freeCarTypes = db.Cars
                .Where(r => r.DealerID == model.DealerID)
                .Except(prebookedCars)
                .GroupBy(p => p.CarType)
                .Select(ct => new                       // (D)
                {
                    TypeNme = ct.Key.type_name,     
                    TypeID = ct.Key.type_id,
                    TypeCount = ct.Count(),
                    NumSelected = 0
                }
                );

            foreach (var fr in freeCarTypes)
            { 
                TypesAvail ta = new TypesAvail();
                {
                ta.NumSelected = fr.NumSelected;
                ta.TypeCount = fr.TypeCount;
                ta.TypeID = fr.TypeID;
                ta.TypeNme = fr.TypeNme;
                }

            }

            // This is where I'm stuck - how do I get the list above, into the ViewModel, to I can generate a list of car types, with a drop down list of how many are available

           // model.TypesAvail = ta;
           // model.TypesAvail = freeCarTypes;

            return View(model);
        }
        else    // model is not valid, so return the View
        {
            return View(model);
        }
    }

1 个答案:

答案 0 :(得分:4)

这个怎么样?

// (C)    
model.TypesAvail = db.Cars.Where(r => r.DealerID == model.DealerID)
                      .Except(prebookedCars)
                      .GroupBy(p => p.CarType)
                      .Select(ct => new TypesAvail                 // (D)
                      {                      
                          TypeNme = ct.Key.type_name,
                          TypeID = ct.Key.type_id,
                          TypeCount = ct.Count(),
                          NumSelected = 0                  
                      };