Asp.NetMVC 3実例学習のExtShop(四)――製品リストページの完成
製品リストページを作成する前に、いくつかの準備をします.まずMvcPagerをダウンロードして製品リストのページを分けました.ダウンロードしたのはMVC 2ベースかもしれませんが、大丈夫です.MVC 3に使えます.心配があれば、ソースコードをダウンロードして再コンパイルしたほうがいいです.ダウンロード後にDLLをリファレンスに追加します.
次に、「Catalog/List/[id]/[page]」へのアクセスを実現するためにルーティングを変更します.Global.asax.csファイルを開き、デフォルトのルーティングの前に次のコードを追加します.
CatalogControllerを開きます.csファイル、ファイルヘッダにMvcPagerへの参照を追加します.コードは以下の通りです.
次にIndex操作のコードを変更します.
コードが入力されたidは、製品分類符号化ではなくページ番号であることに注意してください.ページングを使用するため、ビューに渡されるのはPagedListオブジェクトで、Queryableではなく、これも注意すべき点です.したがって,クエリ結果はtoPagedListメソッドによりQueryableオブジェクトをPagedListオブジェクトに変換する必要がある.1番目のパラメータは現在のページで、idが空の場合はデフォルトで1ページ目です.2番目のパラメータは、ページごとに表示される製品数で、ここでは8つです.
「Index」を右クリックして「ビューを追加」を選択します(、今日は中国語版に変更してメニューも変わりました).ビューに次のコードを追加します.
コードの最初の文はMvcPagerを参照し、2番目の文は受信したデータモデルタイプを定義します.だから製品リストなのでPageData["id"]は空の文字列に設定します.残りのコードとトップページの差は多くありません.34文目はHTML方式でページングコードを表示します.ここで注意したいのは、操作で受信した現在のページパラメータがidで定義されているため、PagerOptionsオプションのPageIndexParameterNameをidに設定することです.
ページは正常に表示する必要があり、Siteで表示する必要があります.cssに次のコードを追加します.
コードから分かるように、List操作には2つのパラメータがあり、1つ目は分類id、2つ目は現在のページ番号である.3行目は、現在の分類idをViewData["id"]を介してビューに渡し、左の分類リストを更新し、ナビゲーションバーを表示します.残りとIndexの操作はあまり差がありません.リスト操作のビューを作成します.ビュー内のコードは次のとおりです.
コード10行目には、ナビゲーションメニューが1つのセクションビューで表示されます.35行目では、PageIndexParameterNameはIndexビューのidではなくpageであることに注意してください.
次に行うのは、ナビゲーションバーの表示を完了することです.ファイルをCatalogControllerに戻す.csファイル、「Navbar」という名前のサブアクションを追加します.コードは次のとおりです.
コードは、まず現在の分類の親クラス番号を取得し、データベースからすべてのカテゴリを一度にクエリーしてソートします.サブオペレーションの分割ビューを作成します.ビューコードは次のとおりです.
コードの中で、">>の表示は必ずHtmlのRawの方法で表示しなければならなくて、さもなくばエラーを提示することができて、">"を使ってもだめで、Razorの文法と衝突があると推定します.他に方法があるかどうか、検討しなかった.
これで、製品リストページは完了しました.
BTW:プロジェクトはまだ完成していないので、ソースコードの提供は考えていませんが、文章を読むと同時にソースコードを提供して参考にしたい読者がいるので、本稿から、一節を完成するたびに、その節のコードを提供します.
ソース:http://download.csdn.net/source/2996287
次に、「Catalog/List/[id]/[page]」へのアクセスを実現するためにルーティングを変更します.Global.asax.csファイルを開き、デフォルトのルーティングの前に次のコードを追加します.
- routes . MapRoute (
- " Catalog " , // Route name
- " Catalog/List/{id}/{page} " , // URL with parameters
- new { controller = " Catalog " , action = " List " , page = 1 } // Parameter defaults
- ) ;
CatalogControllerを開きます.csファイル、ファイルヘッダにMvcPagerへの参照を追加します.コードは以下の通りです.
- using Webdiyer . WebControls . Mvc;
次にIndex操作のコードを変更します.
- public ActionResult Index ( int? id )
- {
- PagedList < T_Products > q = dc . T_Products . OrderByDescending ( m = > m . CreateTime ) . ToPagedList ( id ?? 1 , 8 ) ;
- return View ( q ) ;
- }
コードが入力されたidは、製品分類符号化ではなくページ番号であることに注意してください.ページングを使用するため、ビューに渡されるのはPagedListオブジェクトで、Queryableではなく、これも注意すべき点です.したがって,クエリ結果はtoPagedListメソッドによりQueryableオブジェクトをPagedListオブジェクトに変換する必要がある.1番目のパラメータは現在のページで、idが空の場合はデフォルトで1ページ目です.2番目のパラメータは、ページごとに表示される製品数で、ここでは8つです.
「Index」を右クリックして「ビューを追加」を選択します(、今日は中国語版に変更してメニューも変わりました).ビューに次のコードを追加します.
- @ using Webdiyer . WebControls . Mvc ;
- @ model PagedList < Extshop . Models . T_Products >
-
- @ {
- ViewBag . Title = " " ;
- PageData [ " id " ] = " " ;
- }
- < div class = " nav " >
- < a href = " @Url.Action( " " , " Catalog " ) " > < / a >
- < / div > < br / >
- < div id = " contentMain " style = " width:760px; " >
- < span class = " header " style = " width:750px; " > < / span >
- @ {
- foreach ( var c in Model )
- {
- < ul >
- < li > < a href = ' @ Url . Action ( " Details " , " Product " , new { id = c . ProductID } ) ' > < img src = ' / Images / products / @ c . SamllImageUrl ' alt = " @c.Title " / > < / a > < / li >
- < li class = ' title ' > < a href = ' @ Url . Action ( " Details " , " Product " , new { id = c . ProductID } ) ' > @ c . Title < / a > < / li >
- < li > : < del > @ c . MarketPrice . ToString ( " C " ) < / del > < / li >
- < li > : @ c . UnitPrice . ToString ( " C " ) < / li >
- < li > < span class = " rating-title " > : < / span >
- < div class = ' rating ' id = " @c.ProductID.ToString( " rat - 0 " ) " >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 1 " @ ( c . TotalRating = = 1 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 2 " @ ( c . TotalRating = = 2 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 3 " @ ( c . TotalRating = = 3 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 4 " @ ( c . TotalRating = = 4 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 5 " @ ( c . TotalRating = = 5 ? " checked='checked' " : " " ) / >
- < / div >
- < / li >
- < / ul >
- }
- }
- < div class = " clear " > < / div >
- < div class = ' pagenav ' > @ Html . Pager ( Model , new PagerOptions { PageIndexParameterName = " id " } ) < / div >
- < / div >
-
- < script type = " text/javascript " >
- jQuery ( function ( ) {
- $ ( " div .rating " ) . stars ( ) ;
- } ) ;
- < / script >
コードの最初の文はMvcPagerを参照し、2番目の文は受信したデータモデルタイプを定義します.だから製品リストなのでPageData["id"]は空の文字列に設定します.残りのコードとトップページの差は多くありません.34文目はHTML方式でページングコードを表示します.ここで注意したいのは、操作で受信した現在のページパラメータがidで定義されているため、PagerOptionsオプションのPageIndexParameterNameをidに設定することです.
ページは正常に表示する必要があり、Siteで表示する必要があります.cssに次のコードを追加します.
- 1 #contentMain .clear { clear : both ; }
- 2 #contentMain .pagenav { width : 760px ; text-align : center ; margin-bottom : 10px ; }
- CatalogController.cs , Index List , :
- 1 public ActionResult List(string id, int? page)
- 2 {
- 3 ViewData["id"] = id;
- 4 PagedList q = dc.T_Products
- 5 .Where(m => dc.T_Categories.Where(n => n.CategoryID.Substring(0, id.Length) == id).Select(n => n.CategoryID ).Contains(m.CategoryID))
- 6 .OrderByDescending(m => m.CreateTime).ToPagedList(page ?? 1, 4);
- 7 return View(q);
- 8 }
コードから分かるように、List操作には2つのパラメータがあり、1つ目は分類id、2つ目は現在のページ番号である.3行目は、現在の分類idをViewData["id"]を介してビューに渡し、左の分類リストを更新し、ナビゲーションバーを表示します.残りとIndexの操作はあまり差がありません.リスト操作のビューを作成します.ビュー内のコードは次のとおりです.
- @ using Webdiyer . WebControls . Mvc ;
- @ model PagedList < Extshop . Models . T_Products >
- @ {
- ViewBag . Title = " " ;
- PageData [ " id " ] = ViewData [ " id " ] ;
- }
-
- < div class = " nav " >
- < a href = " @Url.Action( " " , " Catalog " ) " > < / a >
- @ { Html . RenderAction ( " Navbar " , " Catalog " , new { id = ViewData [ " id " ] } ) ; }
- < / div > < br / >
- < div id = " contentMain " style = " width:760px; " >
- < span class = " header " style = " width:750px; " > < / span >
- @ {
- foreach ( var c in Model )
- {
- < ul >
- < li > < a href = ' @ Url . Action ( " Details " , " Product " , new { id = c . ProductID } ) ' > < img src = ' / Images / products / @ c . SamllImageUrl ' alt = " @c.Title " / > < / a > < / li >
- < li class = ' title ' > < a href = ' @ Url . Action ( " Details " , " Product " , new { id = c . ProductID } ) ' > @ c . Title < / a > < / li >
- < li > : < del > @ c . MarketPrice . ToString ( " C " ) < / del > < / li >
- < li > : @ c . UnitPrice . ToString ( " C " ) < / li >
- < li > < span class = " rating-title " > : < / span >
- < div class = ' rating ' id = " @c.ProductID.ToString( " rat - 0 " ) " >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 1 " @ ( c . TotalRating = = 1 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 2 " @ ( c . TotalRating = = 2 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 3 " @ ( c . TotalRating = = 3 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 4 " @ ( c . TotalRating = = 4 ? " checked='checked' " : " " ) / >
- < input name = " @c.ProductID.ToString( " Star0 " ) " type = " radio " class = " star " disabled = " disabled " value = " 5 " @ ( c . TotalRating = = 5 ? " checked='checked' " : " " ) / >
- < / div >
- < / li >
- < / ul >
- }
- }
- < div class = " clear " > < / div >
- < div class = ' pagenav ' > @ Html . Pager ( Model , new PagerOptions { PageIndexParameterName = " page " } ) < / div >
- < / div >
-
- < script type = " text/javascript " >
- jQuery ( function ( ) {
- $ ( " div .rating " ) . stars ( ) ;
- } ) ;
- < / script >
コード10行目には、ナビゲーションメニューが1つのセクションビューで表示されます.35行目では、PageIndexParameterNameはIndexビューのidではなくpageであることに注意してください.
次に行うのは、ナビゲーションバーの表示を完了することです.ファイルをCatalogControllerに戻す.csファイル、「Navbar」という名前のサブアクションを追加します.コードは次のとおりです.
- [ ChildActionOnly ]
- public ActionResult Navbar ( string id )
- {
- List < string > idlist = new List < string > ( ) ;
- idlist . Add ( id ) ;
- for ( int i = 0 ; i < ( id . Length - 2 ) ; i = i + 3 )
- {
- idlist . Add ( id . Substring ( 0 , i + 3 ) ) ;
- }
- var q = dc . T_Categories . Where ( m = > idlist . Contains ( m . CategoryID ) ) . OrderBy ( m = > m . CategoryID ) ;
- return PartialView ( q ) ;
- }
コードは、まず現在の分類の親クラス番号を取得し、データベースからすべてのカテゴリを一度にクエリーしてソートします.サブオペレーションの分割ビューを作成します.ビューコードは次のとおりです.
- @ model IEnumerable < Extshop . Models . T_Categories >
-
- @ {
- foreach ( var c in Model )
- {
- @ Html . Raw ( " >> " ) < a href = ' @ Url . Action ( " List " , " Catalog " , new { id = c . CategoryID } ) ' > @ c . Titel < / a >
- }
- }
コードの中で、">>の表示は必ずHtmlのRawの方法で表示しなければならなくて、さもなくばエラーを提示することができて、">"を使ってもだめで、Razorの文法と衝突があると推定します.他に方法があるかどうか、検討しなかった.
これで、製品リストページは完了しました.
BTW:プロジェクトはまだ完成していないので、ソースコードの提供は考えていませんが、文章を読むと同時にソースコードを提供して参考にしたい読者がいるので、本稿から、一節を完成するたびに、その節のコードを提供します.
ソース:http://download.csdn.net/source/2996287