2012-10-11 31 views
0

我有一個Inventory類,其中不僅包含其自己的字段,還包含對其他類的幾個參考ID。在單個webgrid中呈現多個IEnumberables和單個值屬性

public class Inventory { 

    public int Id { get; set; } 

    public string RtNum { get; set; } 

    public string AcntNum { get; set; } 

    public string CardNum { get; set; } 

    public string Num { get; set; } 

    [Range(1,3)] 
    public int Type { get; set; } 

    public int CompanyId { get; set; } 

    public int BranchId { get; set; } 

    public int PersonId { get; set; } } 

在我的操作中,我從其他類生成了幾個IEnumerable相關字段的列表。我也有幾個我想傳遞給視圖的非列表值。我知道如何創建一個ViewModel以將所有內容傳遞給webgrid,但無法遍歷列表。我也知道如何將索引自動映射到一個列表,請參見How to display row number in MVC WebGrid。 如何將兩者結合起來,以便您可以使用索引遍歷多個列表?

更新#1(詳細)

public class Company { 
    public int Id { get; set; } 
    public string Name { get; set; } } 

public class Branch { 
    public int Id { get; set; } 
    public string Name { get; set; } } 

public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } } 

public class MyViewModel { 
    public int PageNumber { get; set; } 
    public int TotalRows { get; set; } 
    public int PageSize { get; set; } 
    public IEnumerable<Inventory> Inventories { get; set; } 
    public int Index { get; set; } 
    public IEnumerable<string> CmpNm { get; set; } 
    public IEnumerable<string> BrnNm { get; set; } 
    public IEnumerable<string> PrnNm { get; set; }  } 

控制器

public class InventoryController : Controller 
{ // I have a paged gird who’s code is not relevant to this discussion but a pagenumber, 
    // pagesize and totalrows will be generated 
    private ProjectContext _db = new ProjectContext(); 

    public ActionResult Index() { 
    IEnumerable<Inventory> inventories = _db.Inventories; 
    List<string> cmpNm = new List<string>; List<string> brnNm = new List<string>; List<string>  prnNm = new List<string>; 
    foreach (var item in inventories) { string x1 = ""; 
    Company cmps = _db. Company.SingleOrDefault(i => i.Id == item.CompanyId); if (cmps!= null) 
     { x1 = cmps.Name; } cmpNm.Add(x1); x1 = ""; 
    Branch brns = _db. Branch.SingleOrDefault(i => i.Id == item. Branch Id); if (brns!= null) { x1 = brns.Name; } brnNm.Add(x1); x1 = ""; 
    Person pers = _db.Persons.SingleOrDefault(i => i.Id == item. PersonId); 
     if (pers!= null) { x1 = pers.Name; } prnNm.Add(x1); 

    // the MyViewModel now needs to populated with all its properties and generate an index 
    // something along the line of 
    new MyViewModel { PageNumber= pagenumber, PageSize= pagesize, TotalRows=Totalrows, Inventories = inventories; CmpNm=cmpNm, BrnNm=brnNm, PrnNm=prnNm} 

視圖(如何創建索引的問題)

@model.Project.ViewModels.MyViewModel 
@{ var grid = new WebGrid(Model.Inventories, Model.TotalRows, rowsPerPage: Model.PageSize); } 
@grid.GetHtml(columns: grid.Columns( 
    Grid.Column(「PrnNm」, header: "Person", format: @Model.PrnNm.ElementAt(Index)) 
    Grid.Column(「BrnNm」, header: "Branch", format: @Model.BrnNm.ElementAt(Index)) 
    Grid.Column(「CmpNm」, header: "Company", format: @Model.CmpNm.ElementAt(Index)) 
    grid.Column("RtNum", header: "Route"), 
    grid.Column("AcntNum", header: "Account"), 
    grid.Column("CardNum", header: "Card") 
    …  ) ) 

什麼網應看起來不言而喻。

+0

我不明白你的問題。請顯示您的視圖模型以及填充它的控制器操作。您在這裏展示的是您的域模型,它對WebGrid非常不感興趣,因爲您將視圖模型傳遞給視圖。還提供了一個例子,你如何看待這個表。 –

+0

謝謝,請參閱我更新的問題。 – Joe

+0

@DarinDimitrov你可以看看,你還需要什麼嗎?謝謝 – Joe

回答

2

這很不明確你的目標是什麼。但不管它是什麼,我會建議你來定義反映您的視圖的要求,只包含的信息你有興趣在此網格中看到一個真實的視圖模型:

public class InventoryViewModel 
{ 
    public int Id { get; set; } 
    public string PersonName { get; set; } 
    public string BranchName { get; set; } 
    public string CompanyName { get; set; } 
    public string RouteNumber { get; set; } 
    public string AccountNumber { get; set; } 
    public string CardNumber { get; set; } 
} 

現在你可以擁有主視圖型號:

public class MyViewModel 
{ 
    public int PageNumber { get; set; } 
    public int TotalRows { get; set; } 
    public IEnumerable<InventoryViewModel> Inventories { get; set; } 
} 

好吧,認爲現在是很明顯的:

@model MyViewModel 

@{ 
    var grid = new WebGrid(
     Model.Inventories, 
     rowsPerPage: Model.PageSize 
    ); 
} 

@grid.GetHtml( 
    columns: grid.Columns( 
     grid.Column("Id", header: "Inventory id"), 
     grid.Column("PersonName", header: "Person"), 
     grid.Column("BranchName", header: "Branch"), 
     grid.Column("CompanyName", header: "Company"), 
     grid.Column("RouteNumber", header: "Route"), 
     grid.Column("AccountNumber", header: "Account"), 
     grid.Column("CardNumber", header: "Card") 
    )  
) 

現在,所有剩下的就是建立在你的控制器此視圖模型。因爲我不知道你在想什麼,在這裏實現,是否需要內連接或對這些列的左外連接做,我將在這裏舉例的左外連接:

public ActionResult Index() 
{ 
    var inventories = 
     from inventory in _db.Inventories 
     join person in _db.Persons on inventory.PersonId equals person.Id into outerPerson 
     join company in _db.Companies on inventory.CompanyId equals company.Id into outerCompany 
     join branch in _db.Branch on inventory.BranchId equals branch.Id into outerBranch 
     from p in outerPerson.DefaultIfEmpty() 
     from c in outerCompany.DefaultIfEmpty() 
     from b in outerBranch.DefaultIfEmpty() 
     select new InventoryViewModel 
     { 
      PersonName = (p == null) ? string.Empty : p.Name, 
      CompanyName = (c == null) ? string.Empty : c.Name, 
      BranchName = (b == null) ? string.Empty : b.Name, 
      Id = inventory.Id, 
      AccountNumber = inventory.AcntNum, 
      CardNumber = inventory.CardNum, 
      RouteNumber = inventory.RtNum 
     }; 


    var model = new MyViewModel 
    { 
     PageSize = 5, 
     // TODO: paging 
     Inventories = inventories.ToList() 
    }; 

    return View(model); 
} 

而這幾乎它。當然,在這個例子中,我將爲您留下庫存集合的分頁。這應該是相當微不足道的現在到.Skip().Take()您需要的記錄數。

正如您所看到的,ASP.NET MVC非常簡單。您定義視圖模型以反映您需要在視圖中顯示的確切需求,然後在控制器中填充此視圖模型。大多數人都避免使用視圖模型,因爲他們無法填充視圖模型,這可能是由於缺乏對他們所使用的基礎數據訪問技術的知識。正如你在這個例子中看到的那樣,困難並不在於ASP.NET MVC。它位於LINQ查詢中。但是LINQ與MVC完全沒有關係。除了MVC之外,這是應該學習的東西。當你在做MVC時,總是考慮視圖模型和你需要向用戶展示的信息。不要認爲你的數據庫裏有什麼或者這些信息應該來自哪裏。

+0

我已經在使用ViewModels(部分來自閱讀您的所有其他帖子),並具有關注點分離的概念。你在這裏添加的是,ViewModels只是一個可以嵌套在一起的類,利用Linq是填充模型的更好方法。我看到你添加了ID字段,我不知道這是不是習慣,一個philisophical偏好或出於說明的目的。由於它是一個內部數據庫編號,與用戶無關,我傾向於不顯示它,儘管它顯然具有作爲故障排除輔助工具的價值。續... – Joe

+0

續...我更喜歡縮寫字段名稱,但爲了清晰起見,將來會盡量避免發佈簡化的項目模型。一如既往地閱讀你的一篇文章是一種教育,並始終將我的編碼技能提升到一個新的水平。我非常感謝您爲社區提供的優質服務。總結;不需要索引,MVC基於關注點的分離,使ViewModel更專注於視圖中所需的內容,ViewModels可以嵌套並利用Linq的能力來填充模型。再次感謝你。 – Joe

相關問題