Asp.net MVC 3实例学习之ExtShop(四)——完成产品列表页

2024-04-06 02:48

本文主要是介绍Asp.net MVC 3实例学习之ExtShop(四)——完成产品列表页,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      在完成产品列表页前要做一些准备功夫。首先是去下载MvcPager用了为产品列表分页。下载的可能是基于MVC 2的,没关系,可以用在MVC 3上。如果有担心,下载源代码重新编译一次好了。下载后将DLL添加到引用里。

      接着是要修改一下路由以实现“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 >
10          < / div > < br   / >
11          < div   id = " contentMain "   style = " width:760px; " >
12                  < span   class = " header "     style = " width:750px; " > 产品列表 < / span >
13                          @ {
14                                  foreach ( var   c   in   Model )
15                                  {
16                                          < ul >
17                                          < li > < a   href = ' @ Url . Action ( " Details " ,   " Product " ,   new   {   id   =   c . ProductID   } ) ' > < img   src = ' / Images / products / @ c . SamllImageUrl '   alt = " @c.Title "   / > < / a > < / li >
18                                          < li   class = ' title ' > < a   href = ' @ Url . Action ( " Details " ,   " Product " ,   new   {   id   =   c . ProductID   } ) ' > @ c . Title < / a > < / li >
19                                          < li > 市场价: < del > @ c . MarketPrice . ToString ( " C " ) < / del > < / li >
20                                          < li > 当前价: @ c . UnitPrice . ToString ( " C " ) < / li >
21                                          < li > < span   class = " rating-title " > 评 价: < / span >
22                                                  < div   class = ' rating '   id = " @c.ProductID.ToString( " rat - 0 " ) " >                                        
23                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 1 "   @ ( c . TotalRating   = =   1   ?   " checked='checked' "   :   " " )     / >
24                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 2 "   @ ( c . TotalRating   = =   2   ?   " checked='checked' "   :   " " )   / >
25                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 3 "   @ ( c . TotalRating   = =   3   ?   " checked='checked' "   :   " " )     / >
26                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 4 "   @ ( c . TotalRating   = =   4   ?   " checked='checked' "   :   " " )     / >
27                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 5 "   @ ( c . TotalRating   = =   5   ?   " checked='checked' "   :   " " )     / >                                        
28                                                  < / div >
29                                          < / li >
30                                          < / ul >                
31                                  }
32                          }
33                  < div   class = " clear " > < / div >
34                  < div   class = ' pagenav ' > @ Html . Pager ( Model ,   new   PagerOptions   {   PageIndexParameterName   =   " id "   } ) < / div >                        
35          < / div >
36                 
37          < script   type = " text/javascript " >
38                  jQuery ( function   ( )   {
39                          $ ( " div   .rating " ) . stars ( ) ;
40                  } ) ;
41          < / script >
42   

      代码第一句引用MvcPager,第二句定义接收的数据模型类型。因为是所以产品列表,所以PageData["id"]设置为空字符串。其余代码和首页的差不多。第34句使用HTML方式显示分页代码。这里要注意的是PagerOptions选项中的PageIndexParameterName要设置为id,因为操作中接收的当前页参数是以id定义的。

      页面需要正常显示,还需要在Site.css中添加以下代码:

#contentMain   .clear { clear : both ; }
#contentMain   .pagenav { width : 760px ; text-align : center ; margin-bottom : 10px ; }

      切换回CatalogController.cs文件,在Index操作下添加一个List操作,其代码如下:

                public   ActionResult   List(string   id,   int?   page)
                {
                        ViewData["id"]   =   id;
                        PagedList   q   =   dc.T_Products
                                .Where(m   =>   dc.T_Categories.Where(n   =>   n.CategoryID.Substring(0,   id.Length)   ==   id).Select(n   =>     n.CategoryID   ).Contains(m.CategoryID))
                                .OrderByDescending(m   =>   m.CreateTime).ToPagedList(page   ??   1,   4);
                        return   View(q);
                }
 

 

      从代码可以看到,List操作有两个参数,第1个是分类id,第2个是当前页号。第3行通过ViewData["id"]向视图传递当前的分类id,以更新左边分类列表以及显示导航条。其余的和Index操作差不多。现在为List操作创建一个视图,视图内代码如下:

@ 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 >
10                  @ { Html . RenderAction ( " Navbar " ,   " Catalog " ,   new   {   id   =   ViewData [ " id " ]   } ) ; }
11          < / div > < br   / >
12          < div   id = " contentMain "   style = " width:760px; " >
13                  < span   class = " header "   style = " width:750px; " > 产品列表 < / span >
14                          @ {
15                                  foreach ( var   c   in   Model )
16                                  {
17                                          < ul >
18                                          < li > < a   href = ' @ Url . Action ( " Details " ,   " Product " ,   new   {   id   =   c . ProductID   } ) ' > < img   src = ' / Images / products / @ c . SamllImageUrl '   alt = " @c.Title "   / > < / a > < / li >
19                                          < li   class = ' title ' > < a   href = ' @ Url . Action ( " Details " ,   " Product " ,   new   {   id   =   c . ProductID   } ) ' > @ c . Title < / a > < / li >
20                                          < li > 市场价: < del > @ c . MarketPrice . ToString ( " C " ) < / del > < / li >
21                                          < li > 当前价: @ c . UnitPrice . ToString ( " C " ) < / li >
22                                          < li > < span   class = " rating-title " > 评 价: < / span >
23                                                  < div   class = ' rating '   id = " @c.ProductID.ToString( " rat - 0 " ) " >                                        
24                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 1 "   @ ( c . TotalRating   = =   1   ?   " checked='checked' "   :   " " )     / >
25                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 2 "   @ ( c . TotalRating   = =   2   ?   " checked='checked' "   :   " " )   / >
26                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 3 "   @ ( c . TotalRating   = =   3   ?   " checked='checked' "   :   " " )     / >
27                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 4 "   @ ( c . TotalRating   = =   4   ?   " checked='checked' "   :   " " )     / >
28                                                          < input   name = " @c.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 5 "   @ ( c . TotalRating   = =   5   ?   " checked='checked' "   :   " " )     / >                                        
29                                                  < / div >
30                                          < / li >
31                                          < / ul >                
32                                  }
33                          }
34                  < div   class = " clear " > < / div >
35                  < div   class = ' pagenav ' > @ Html . Pager ( Model ,   new   PagerOptions   {   PageIndexParameterName   =   " page "   } ) < / div >                        
36          < / div >
37                 
38          < script   type = " text/javascript " >
39                  jQuery ( function   ( )   {
40                          $ ( " div   .rating " ) . stars ( ) ;
41                  } ) ;
42          < / script >
43   
44   
45   

      代码第10行通过一个分部视图显示导航菜单。第35行要注意PageIndexParameterName是“page”,而不是Index视图的“id”了。

      下一步要做的是完成导航条的显示。将文件切换回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 ) ) ;
                        }
10                          var   q   =   dc . T_Categories . Where ( m   = >   idlist . Contains ( m . CategoryID ) ) . OrderBy ( m   = >   m . CategoryID ) ;
11                          return   PartialView ( q ) ;
12                  }
13   

 

      代码首先获取了当前分类的父类编号,然后从数据库一次查询出所有类别并排序。现在为该子操作创建一个分部视图,视图代码如下:

@ 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

这篇关于Asp.net MVC 3实例学习之ExtShop(四)——完成产品列表页的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878814

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get