2

ビューコードは次のとおりです。

@helper sortLink(string name, int id)
{
<a href="@Url.Action("Products", "Home", new { sortBy = id, isasc = (id ==     ViewBag.sortBy ? !@ViewBag.isAsc : @ViewBag.isAsc).ToString().ToLower() })">@name</a> 
}

<h2 class="center">Products</h2>

<table class="Products">
@* header *@

<tr>
<th>@sortLink("ID",1)</th>
<th>@sortLink("Name",2)</th>
<th>@sortLink("Number", 3)</th>
<th>@sortLink("Color", 4)</th>
<th>@sortLink("Standard Cost", 5)</th>
<th>@sortLink("List Price", 6)</th>
<th>@sortLink("Size", 7)</th>
<th>@sortLink("Weight", 8)</th>
</tr>

これはコントローラーコードです:

  {
    AdventureWorksLT2008R2Entities db = new AdventureWorksLT2008R2Entities();
    const int pageSize = 10;

    [HttpGet]
    public ActionResult Products(int page = 1, int sortBy = 1, bool isAsc = true)
    {
        IEnumerable<Product> products;

        #region sorting
        switch (sortBy)
        {
            case 1:
                products = isAsc ? db.Products.OrderBy(p => p.ProductID) : db.Products.OrderByDescending(p => p.ProductID);
                break;

            case 2:
                products = isAsc ? db.Products.OrderBy(p => p.Name) : db.Products.OrderByDescending(p => p.Name);
                break;

            case 3:
                products = isAsc ? db.Products.OrderBy(p => p.ProductNumber) : db.Products.OrderByDescending(p => p.ProductNumber);
                break;

            case 4:
                products = isAsc ? db.Products.OrderBy(p => p.Color) : db.Products.OrderByDescending(p => p.Color);
                break;

            case 5:
                products = isAsc ? db.Products.OrderBy(p => p.StandardCost) : db.Products.OrderByDescending(p => p.StandardCost);
                break;

            case 6:
                products = isAsc ? db.Products.OrderBy(p => p.ListPrice) : db.Products.OrderByDescending(p => p.ListPrice);
                break;

            case 7:
                products = isAsc ? db.Products.OrderBy(p => p.Size) : db.Products.OrderByDescending(p => p.Size);
                break;

            case 8:
                products = isAsc ? db.Products.OrderBy(p => p.Weight) : db.Products.OrderByDescending(p => p.Weight);
                break;
        }
        #endregion

        products = db.Products
            .OrderBy(p=>p.ProductID)
            .Skip((page - 1) * pageSize)
            .Take(pageSize)
            .ToList();

        ViewBag.CurrentPage = page;
        ViewBag.PageSize = pageSize;
        ViewBag.TotalPages = Math.Ceiling((double)db.Products.Count()/pageSize);

        return View(products);

私はチュートリアルに従っていて、このエラーが表示され続けるソート部分を見つけました。エラーを取り除くためにあなたの助けが必要です。Sortlinkヘルパーメソッドで何が起こっているのか説明してください。よく理解できません。このチュートリアルを書いた人は、この部分についてあまり説明しませんでした。

4

1 に答える 1

3

問題は、ビューで使用しようとしているViewBag.isAscが、割り当てられていないことだと思います。また、caseステートメントの後で、products変数をリセットします。これにより、caseステートメントで設定した順序が完全に無効になります。これを削除してください。したがって、その後は次のようになります。

switch(sortBy) {
    // include all the case statements here as you have them

    // you need to add a default section to make it a valid switch statement
    default:
    break;
}
#endregion

// (remove the products = statement that was here, it's not needed

ViewBag.CurrentPage = page;
ViewBag.PageSize = pageSize;
ViewBag.TotalPages = Math.Ceiling((double)db.Products.Count()/pageSize);

// add these two lines, as required by the View
ViewBag.isAsc = isAsc;
ViewBag.sortBy = sortBy;


return View(products
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToList()
);
于 2012-09-02T07:38:40.757 に答える