質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

Q&A

解決済

2回答

6004閲覧

WebGridで2ページ目以降が表示されない

sisyamo_09

総合スコア6

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

0グッド

0クリップ

投稿2016/12/05 12:58

こんにちは。razor構文を使用したwebシステムを開発しています。
検索結果をWebGridを使用しページャー付きで表示している
のですが、2ページ目以降の表示がうまくいきません。

###発生している問題・エラーメッセージ
検索条件を入力→検索結果ボタンを押下
結果表示:問題なし(先頭10件表示)
次ページを選択:結果表示領域が真っ白(取得失敗?)

###該当のソースコード

▼モデルクラス public testModel{ public string test1 //検索条件1 public string test2 //検索条件2 public string test3 //検索条件3 public IEnumerable<testResult> result //検索結果列 } public testResult{ public int ID //結果項目1 public int Name //結果項目2 } ▼cshtml @model Model.testModel : //検索条件、検索ボタンなど : form{ @if(Model.result.Count() > 0){ WebGrid grid = new WebGrid(Model.result, canPage: true, rowsPerPage: 10); @grid.GetHtml(); } }

###試したこと
▼modelの構造がIEnumerable<T>のみだと2ページ目以降も問題なく表示されました。
(検索条件もモデルとして定義したいので除外)
例:cshtml先頭をtestModel→IEnumerable<testResult>に変更
▼WebGridの宣言前に var result01 = Model.result; として
引数にresult01 を渡してみたがダメでした
(using XXXで明示的にIEnumerable<testResult> result01と宣言しなおしても同様)
▼new WebGrid()の引数にはModel.XXXの形式は不可?
(必ず"Model"と書かなければいけない?)
▼grid.Bind()を使用してみましたが同様に2ページ目以降が出ません

###補足情報(言語/FW/ツール等のバージョンなど)
C#,asp.net MVC4,razor,WebGrid
足りていない情報がありましたら教えてください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/05 13:05

Visual Studio のバージョン、使用しているブラウザ、開発に使っているサーバーなどの情報を提供できないでしょうか?
sisyamo_09

2016/12/05 23:40

VisualStudioExpress2013forWeb、InternetExplorer11、WindowsServer2012R2 となります。よろしくお願いします。
guest

回答2

0

自己解決

解決しました。

原因はControllerにてアクションを分けていたことのようです。
開発している画面の動作からControllerを「初期表示」「検索ボタン押下」
の2つに分割していました。

▼cshtml
@model Model.testModel
form1(フォーム名=ファイル名,Post送信){
検索条件
検索ボタン(submit)
}
form2(){
@if(Model.result.Count() > 0){
WebGrid grid = new WebGrid(Model.result, canPage: true, rowsPerPage: 10);
@grid.GetHtml();
}
}
▼Controller
[HttpGet]
ActionResult ファイル名(){
//初期表示動作(空のモデル型を返す)
}

[HttpPost]
ActionResult ファイル名(testModel condition){
//検索処理(検索結果テーブルを返す)
}

WebGridが生成するページャーリンクは【Get送信で】指定ページの
情報をその都度取得しに行く仕様となっているみたいです。
(一度結果を全件取得しますが、ページ遷移が行われる度に結果の再取得を行っています)

よって意図しているPostでの検索処理ではなくGetでの初期化処理が走ってしまい
2ページ目以降のすべてのページ取得に失敗する、というのが真相でした。
(※メニューから検索画面への遷移はGet送信です)

WebGrid内のページャー処理をわざわざPostに変更するのも大変なので
回避策としてControllerの構造を1つにまとめました。
ActionResult ファイル名(testModel condition){
if(condition.test1==null){
//初期表示動作
return 空のモデル
}
//以降検索処理

return 検索結果列
}
検索条件の1つがnullならば初期表示と判断しています。

本当はControllerの操作をアクションごとに分けたかったのですが
上記の理由から1Controllerで処理を行おうと思います。

まさかControllerの構造に原因があるとは思わず
最初の説明で省いてしまったこと、お詫びいたします。

投稿2016/12/07 11:50

sisyamo_09

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問者さんと同じ Model は作れませんので、似たようなナビゲーションプロパティを持つ既存の Model を使って試してみましたが、問題(2 ページ以降が表示されない)は再現できませんでした。

使った Model は、Microsoft が無償で提供している AdventureWorksLT サンプルデータベースからデータベースファーストで作った EDM の ProductCategory クラスと Product クラスで、ProductCategory クラスはその中に Product というナビゲーションプロパティを持っています(データベース上で言うと Product テーブルの ProductCategoryID フィールドと ProductCategory テーブルの主キーが FK 制約関係になっています)。

AdventureWorksLT サンプルデータベースと EDM の作成については以下のチュートリアルを見てください。

10 行でズバリ!! ASP.NET MVC を構成する各コンポーネントとネ​ーミング ルール (C#)
https://code.msdn.microsoft.com/10-ASPNET-MVC-C-8566eeb5/

その記事にある AddressController に以下のアクションメソッドを追加します。id = 18 としたのは FK 制約がかかった Product テーブルのレコードの数(即ち、Product プロパティで取得できる Product クラスのコレクションの中身の数)が多い(ページングの状況を見ることができる)という理由のみです。

public ActionResult WebGrid(int id = 18) { var db = new AdventureWorksLT_DataEntities(); var item = (from a in db.ProductCategory where a.ProductCategoryID == id select a).FirstOrDefault(); return View(item); }

View はスキャフォールディング機能を利用して自動生成したものの最後に WebGrid のコードを追加し、Model.Product プロパティで取得できる Product クラスのコレクションをページングして表示するようにしました。

@model AdventureWorksLT.ProductCategory @{ ViewBag.Title = "WebGrid"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>WebGrid</h2> <fieldset> <legend>ProductCategory</legend> <div class="display-label"> @Html.DisplayNameFor(model => model.ParentProductCategoryID) </div> <div class="display-field"> @Html.DisplayFor(model => model.ParentProductCategoryID) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.Name) </div> <div class="display-field"> @Html.DisplayFor(model => model.Name) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.rowguid) </div> <div class="display-field"> @Html.DisplayFor(model => model.rowguid) </div> <div class="display-label"> @Html.DisplayNameFor(model => model.ModifiedDate) </div> <div class="display-field"> @Html.DisplayFor(model => model.ModifiedDate) </div> </fieldset> <p> @Html.ActionLink("Edit", "Edit", new { id=Model.ProductCategoryID }) | @Html.ActionLink("Back to List", "Index") </p> <div> @{ var grid = new WebGrid(Model.Product); } @grid.GetHtml() </div>

結果、期待通り WebGrid でページングされます。ということで、やり方の問題だと思います。

ちなみに、自分の環境は Vista SP2 32-bit, IIS7, SQL Server 2008 Express, Visual Studio 2010 Professional, MVC4 インターネットアプリケーション、IE9 です。そこは今回の問題とは関係なさそうですが。

投稿2016/12/06 02:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sisyamo_09

2016/12/07 11:54

回答して頂き、ありがとうございました。 上記方法を見てModel以外に原因があるのではと思い色々検証した結果 答えにたどり着くことができました。感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問