0

独自のフィールドだけでなく、他のクラスへのいくつかの参照 ID を含むインベントリ クラスがあります。

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 に渡す方法は知っていますが、リストを反復処理する方法がありません。また、インデックスを 1 つのリストに AutoMap する方法も知っています。 「MVC WebGrid で行番号を表示する方法」を参照してください。インデックスを使用して複数のリストを反復処理できるようにするには、2 つをどのように組み合わせますか?

更新 #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}

View (Indexの作り方が問題)

@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")
    …      )    )

グリッドがどのように見えるかは自明です。

4

1 に答える 1

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

そして、それはほとんどそれです。もちろん、この例では、Inventories コレクションのページネーションを残しています。これで、必要なレコードの数はかなり簡単.Skip()になるはずです。.Take()

ご覧のとおり、ASP.NET MVC は非常に単純です。ビューに表示する必要があるものの正確な要件を反映するようにビュー モデルを定義してから、このビュー モデルをコントローラーに入力します。ほとんどの人は、おそらく使用している基盤となるデータ アクセス テクノロジの知識が不足しているため、ビュー モデルを作成できないため、ビュー モデルを使用しません。この例でわかるように、問題は ASP.NET MVC にはまったくありません。それは LINQ クエリにあります。しかし、LINQ は厳密には MVC とは何の関係もありません。MVCとは別に学ぶべきものです。MVC を実行するときは、ビュー モデルと、ユーザーに提示する必要がある情報について常に考えてください。データベースに何があるのか​​、またはこの情報がどこから来るのかという観点から考えないでください。

于 2012-10-16T07:24:02.717 に答える