2012-08-07 72 views
2

我讓自己完全困惑,如果有人能夠再次指向正確的方向,我將不勝感激。在ASP.Net中將值列表放入視圖模型中MVC

我試圖將一個搜索表單添加到一個虛構的項目中,用於我自己的學習目的。

想法是 - 我有一個日期文本框,以及多少天租用文本框 - 當搜索時 - 代碼應該查找所有已輸入日期之間已預訂的汽車,以及日期加上號碼所需的天數。 (A)

這將產生汽車,其必須被從搜索(B)的下一部分

然後查找汽車(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?

它是我的SearchViewModel使用IQueryable這是錯誤的,或者我應該在這裏使用別的東西 - 我會繞圈。

感謝您的幫助,

馬克

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); 
     } 
    } 

回答

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     
         }; 
+0

非常感謝 - 完美的作品。有時我覺得事情比他們更復雜 - 我真的喜歡MVC/Linq,並且只是抓住了表面!乾杯,馬克 – Mark 2012-08-07 12:25:14