Asp.net MVC 3实例学习之ExtShop(五)——产品详细页

      在产品详细页需要使用到tab控件,在jquery的ui包已包含改控件,因而将相应文件链接加到母版页就可以了。

      打开“ProductController”文件,在里面添加一个Details操作,代码如下:

                public   ActionResult   Details ( int   id )
                {
                        var   q   =   dc . T_Products . Single ( m   = >   m . ProductID   = =   id ) ;
                        return   View ( q ) ;
                }
 

      完成后创建对应的视图页,并完成整个页面框架,代码如下:

@ model   Extshop . Models . T_Products
 
@ {
        ViewBag . Title   =   Model . Title ;
        PageData [ " id " ]   =   Model . CategoryID ;
}
 
        < div   class = " nav " >
                < a   href = " @Url.Action( " " ,   " Catalog " ) " > 产品 < / a >
10                  @ { Html . RenderAction ( " Navbar " ,   " Catalog " ,   new   {   id   =   PageData [ " id " ]   } ) ; }
11                  @ Html . Raw ( " >> " )
12                  @ Model . Title
13          < / div > < br   / >
14          < div   id = " contentMain "   style = " width:760px; " >
15                  < span   class = " header "     style = " width:750px; "   id = " producttitle " > @ Model . Title < / span >
16                  < div   class = " img " >
17                  < a   href = " /images/products/@Model.LargeImageUrl "   rel = " lightbox " > < img   src = " /images/products/@Model.SamllImageUrl "   alt = " @Model.Title "   width = " 170 "   height = " 190 "   / > < / a >
18                  < / div >
19                  < div   class = " details " >
20                          < ul >
21                          < li > 市场价格: < del > @ Model . MarketPrice . ToString ( " C " ) < / del > < / li >
22                          < li   id = ' unitprice ' > 当前价格: @ Model . UnitPrice . ToString ( " C " ) < / li >
23                          < li > < span > 用户评价: < / span >
24                                  < div   class = ' rating '   id = ' rating1 ' >
25                                          < input   name = " @Model.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 1 "   @ ( Model . TotalRating   = =   1   ?   " checked='checked' "   :   " " )     / >
26                                          < input   name = " @Model.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 2 "   @ ( Model . TotalRating   = =   2   ?   " checked='checked' "   :   " " )   / >
27                                          < input   name = " @Model.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 3 "   @ ( Model . TotalRating   = =   3   ?   " checked='checked' "   :   " " )     / >
28                                          < input   name = " @Model.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 4 "   @ ( Model . TotalRating   = =   4   ?   " checked='checked' "   :   " " )     / >
29                                          < input   name = " @Model.ProductID.ToString( " Star0 " ) "   type = " radio "   class = " star "   disabled = " disabled "   value = " 5 "   @ ( Model . TotalRating   = =   5   ?   " checked='checked' "   :   " " )     / >                                                                        
30                                  < / div >
31                          < / li >
32                          < li > 制造厂商: @ Model . Manufacturers < / li >
33                          < li > 产品型号: @ Model . Model < / li >
34                          < li > 库存情况: @ ( Model . Stock > 0   ?     @ Html . Raw ( "   color='blue'>有货 " )   :   @ Html . Raw ( "   color='red'>缺货 " ) ) < / li >
35                          < li > < hr / > < / li >
36                          < li > < a   href = ' # '   class = ' cart '   onclick = ' ' > < img   alt = " "   width = " 50 "   height = " 22 "   src = ' / images / buy . jpg '     / > < / a > < / li >
37                          < / ul >                        
38                  < / div >
39                  < div   class = ' clear ' > < / div >                
40                  < div   id = " tabs "   style = " width:740px;margin:auto; " >
41                      < ul   style = " width:727px; " >
42                          < li > < a   href = " #tabs-1 " > 产品描述 < / a > < / li >
43                          < li > < a   href = " #tabs-2 " > 规格参数 < / a > < / li >
44                          < li > < a   href = " #tabs-3 " > 保修条款 < / a > < / li >
45                          < li > < a   href = " #tabs-4 " > 评论 < / a > < / li >
46                      < / ul >
47                      < div   id = " tabs-1 " >
48                          < p > @ Model . Description < / p >
49                      < / div >
50                      < div   id = " tabs-2 "   style = " border:0; " >
51                          < br   / >   < br   / >
52                          < table   id = " "   width = " 100% "   cellpadding = " 0 "   cellspacing = " 0 "   border = " 0 " > @ Html . Raw ( @ Model . Specification ) < / table >
53                      < / div >
54                      < div   id = " tabs-3 " >
55                          < p > @ Model . Warranty < / p >
56                      < / div >
57                      < div   id = " tabs-4 " >
58                      < / div >
59                  < / div >
60                  < br   / >
61          < / div >
62   
63   
码第10行从一个分布视图获取导航信息,这个等会再创建。从第40行到59行是创建一个tab控件,评论页的内容暂时为空,等下再创建。第52行中的产品描述数据是已html代码保存在数据库的,所以要用Html的Raw方法直接显示,不需要进行编码输出。要tab控件正确显示,还需要在模版页jquery函数内加入以下代码:
$ ( " #tabs " ) . tabs ( ) ;

   现在要完成导航信息,打开CatalogController文件,添加一个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   

  

      代码首先获取产品类别的父类编号,然后查询出父类进行显示。右键单击“Navbar”创建分页页面,页面的内容如下:

@ 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 >
        }
}

 

        现在要完成评论的显示。评论我们使用分别页面很容易显示。首先在产品详细信息页内的id为“tabs-4”的div下添加以下代码:

                                < div   style = " clear:both; " > < / div >
                                < div   id = " CommentList " >
                                @ { Html . RenderAction ( " Index " ,   " Comment " ,   new   {   id   =   @ Model . ProductID ,   page   =   1   } ) ; }
                                < / div >
                                < br   / >
                                @ { Html . RenderAction ( " AddComment " ,   " Comment " ,   new   {   id   =   @ Model . ProductID   } ) ; }
 

 

      代码第3行使用一个分部页面显示评论内容。第6行就用分部页面显示评论添加表单。

      新建一个名称为“CommentController”的控制器,并修改index操作代码如下:

                public   ActionResult   Index ( int   id , int ?   page )
                {
                        ViewData [ " ProdcutID " ]   =   id ;
                        PagedList < T_Comment >   q   =   dc . T_Comment . Where ( m   = >   m . ProductID   = =   id ) . OrderByDescending ( m = > m . CreateTime ) . ToPagedList ( page   ? ?   1 , 2 ) ;
                        return   PartialView ( q ) ;
                }
 

 

      代码中第1个参数id表示的是产品的id,第2个参数是评论的当前页。和产品列表一样,使用mvcPager进行分页。完成后创建分部视图页,并将其代码修改如下:

@ using   Webdiyer . WebControls . Mvc ;
@ model   PagedList < Extshop . Models . T_Comment >
@ {
        foreach   ( var   c   in   Model )
        {
                < div   class = " row "   >
                < div   class = " title " > @ c . Title < / div >
                < b > @ c . Username < / b > & nbsp ; 发表于 @ ( c . CreateTime ) < br / >
                  @ c . Description                              
10                  < / div >
11          }
12  }
13  < br   / >
14  < div   class = ' pagenav ' > @ Ajax . Pager ( Model ,   new   PagerOptions { PageIndexParameterName = " page " } ,   new   AjaxOptions   {   UpdateTargetId   =   " CommentList "   } ) < / div >              
15   

       代码中第14行使用了Ajax分页的方法,这样,就可以使用Ajax自动更新该部分。在AjaxOption中定义了UpdateTargetId参数为“CommentList”,意味着当Ajax加载数据后,会自动更新id为“CommentList”的html元素内的内容。

      最后要完成的是评论添加分部视图。首先需要创建一个表单模型。在Models目录创建一个名称为“CommentModels”的类,并将类代码修改如下:

        public   class   CommentModels
        {
 
                [ Display ( Name   =   " 评分 " ) ]
                public   int   Rating   {   get ;   set ;   }
 
                [ Required ( ErrorMessage   =   " 请输入“标题” " ) ]
                [ Display ( Name   =   " 标题 " ) ]
                public   string   Title   {   get ;   set ;   }
10   
11                  [ Required ( ErrorMessage   =   " 请输入“内容” " ) ]
12                  [ Display ( Name   =   " 内容 " ) ]
13                  public   string   Description   {   get ;   set ;   }
14   
15          }
16   

 

      我们只定义需要用户输入的3个项就行了,产品编号和发表用户这些可以从其它地方获取。完成后,切换到CommentController控制器文件,添加显示表单的控制器,其代码如下:

                [ ChildActionOnly ]
                public   ActionResult   AddComment ( int   id )
                {
                        ViewData [ " ProductID " ]   =   id ;
                        return   PartialView ( ) ;
                }
 

 

      在这里需要注意的是要将产品编号带到分部视图。然后创建分部视图,代码如下:

@ model   Extshop . Models . CommentModels
 
@ using   ( Ajax . BeginForm ( " AddComment " ,   " Comment " , new   {   id = ViewData [ " ProductID " ]   } ,   new   AjaxOptions   {   OnSuccess   =   " CommentSuccess " ,   LoadingElementId   =   " CommentLoad " ,   UpdateTargetId   =   " CommentMsg "  
        , OnBegin = " CommentBegin " } ,   new   {   id   =   " CommentForm "   } ) )
{      
        < div >
                < fieldset >
                        < legend > < / legend >
                                < div   style = " width:600px;display:block;height:30px; " >
10                                  < div   id = ' rating - select '   style = " width:300px; " >
11                                  @ Html . LabelFor ( m   = >   m . Rating )
12                                  @ Html . DropDownListFor ( m   = >   m . Rating ,   new   SelectList ( new   Dictionary < string , string >   {  
13                                          { " 1 " , " 1 " } ,
14                                          { " 2 " , " 2 " } ,
15                                          { " 3 " , " 3 " } ,
16                                          { " 4 " , " 4 " } ,
17                                          { " 5 " , " 5 " }
18                                    } ,   " Key " ,   " Value " ) ,   new   {   @ class   =   " star " , width = " 120 "   } )
19                                  < / div >                                
20                                  < div   class = " error " >
21                                          @ Html . ValidationMessageFor ( m   = >   m . Rating )
22                                  < / div >
23                                  < / div >
24                                < p   style = " width:600px;display:block; " >
25                                  @ Html . LabelFor ( m   = >   m . Title )
26                                  @ Html . TextBoxFor ( m   = >   m . Title ,   new   {   style   =   " width:500px; "   } )                                
27                                < / p >
28                                  < div   class = " error " >
29                                          @ Html . ValidationMessageFor ( m   = >   m . Title )
30                                  < / div >
31                                < p   style = " width:600px;display:block; " >
32                                  @ Html . LabelFor ( m   = >   m . Description )
33                                  @ Html . TextAreaFor ( m   = >   m . Description ,   new   {   style = " width:500px; "   } )                            
34                                < / p >
35                                  < div   class = " error " >
36                                          @ Html . ValidationMessageFor ( m   = >   m . Description )
37                                  < / div >
38                          < p   style = " text-align:center;width:600px; " >
39                                  < input   id = " ComentSubmit "   type = " submit "   value = " 保存 "   / >
40                          < / p >
41                          < p   style = " text-align:center;display:none; "   id = " CommentLoad " > < img   src = " /Images/blue-loading.gif "   alt = " 正在保存…… "   / > < / p >
42                          < p   style = " text-align:center;color:Red; "   id = " CommentMsg " > < / p >
43                  < / fieldset >
44          < / div >
45  }
46   
47  < script   type = " text/javascript " >
48          function   CommentSuccess ( e )   {
49                  $ ( " #CommentForm   input " ) . removeAttr ( " readonly " ) ;
50                  $ ( " #CommentSubmit " ) . removeAttr ( " disabled " ) ;
51                  if   ( e . Success )   {
52                          $ ( " #CommentForm " ) [ 0 ] . reset ( ) ;
53                          $ ( " #CommentMsg " ) . html ( e . Message ) ;
54                          var   url   =   window . location ;
55                          re   =   / ( [ 0 - 9 ] * ) [ # ] ? $ / ig ;
56                          var   r   =   re . exec ( url )
57                          if ( r ) {
58                                  for   ( var   i   =   0 ;   i   <   r . length - 1 ;   i + + )   {
59                                          if   ( ! isNaN ( r [ i ] ) )   {
60                                                  $ ( " #CommentList " ) . load ( " /Comment/ "   +   r [ i ]   +   " /1 " ) ;                                                
61                                          }
62                                  }
63                          }
64                  }   else   {
65                          $ ( " #CommentMsg " ) . html ( e . Message ) ;
66                  }
67          }
68   
69          function   CommentBegin ( e )   {
70                  $ ( " #CommentForm   input " ) . attr ( " readonly " ,   true ) ;
71                  $ ( " #CommentSubmit " ) . attr ( " disabled " ,   " disabled " ) ;
72                  $ ( " #CommentMsg " ) . html ( " " ) ;
73          }
74   
75  < / script >

 

      表单将已Ajax的方式提交,所以在这里使用的是Ajax.BeginForm,而不是Html.BeginForm。表单提交的路径将会是“/Comment/AddComment/{id}”,其中的id是产品的编号。代码第12行到18行将创建一个select元素用来生成评价输入控件。代码54行到62行的作用是评论保存后,通过页面路径获取产品编号,然后通过Ajax更新一下评论分部视图的显示。

      余下的工作是完成评论保存控制器,其代码如下:

                [ HttpPost ]
                public   JsonResult   AddComment ( int   id , CommentModels   model )
                {
                        if   ( ModelState . IsValid )
                        {
                                if   ( User . Identity . IsAuthenticated )
                                {
                                        try
                                        {
10                                                  T_Comment   comment   =   new   T_Comment ( ) ;
11                                                  comment . Description   =   model . Description ;
12                                                  comment . ProductID   =   id ;
13                                                  comment . Rating   =   model . Rating ;
14                                                  comment . Title   =   model . Title ;
15                                                  comment . Username   =   User . Identity . Name ;
16                                                  comment . CreateTime   =   DateTime . Now ;
17                                                  try
18                                                  {
19                                                          dc . T_Comment . InsertOnSubmit ( comment ) ;
20                                                          dc . SubmitChanges ( ) ;
21                                                          return   Json ( new   {   Success   =   true ,   Message   =   " 评论已保存! "   } ,   JsonRequestBehavior . AllowGet ) ;
22                                                  }
23                                                  catch ( Exception   e )
24                                                  {
25                                                          return   Json ( new   {   Success   =   false ,   Message   =   " 评论保存失败:数据错误! "   } ,   JsonRequestBehavior . AllowGet ) ;
26                                                  }
27                                          }
28                                          catch
29                                          {
30                                                  return   Json ( new   {   Success   =   false ,   Message   =   " 评论保存失败:数据错误! "   } ,   JsonRequestBehavior . AllowGet ) ;
31                                          }
32                                  }
33                                  else
34                                  {
35                                          return   Json ( new   {   Success   =   false ,   Message   =   " 评论保存失败:请先登录! "   } ,   JsonRequestBehavior . AllowGet ) ;
36                                  }
37                          }
38                          return   Json ( new   {   Success   =   false ,   Message   =   " 添加评论失败:提交的数据存在错误! "   } ,   JsonRequestBehavior . AllowGet ) ;
39                  }
40   

 

      代码第1行表示改操作是接收Post的操作。AddComment操作将接收两个参数,第1个是产品编号,第2个是用户提交的评论内容。因为使用Ajax提交,所以该操作不需要返回视图,只需要返回Json数据,所以操作的返回值是JsonResult。第4句判断用户的输入是否符合要求。第6句判断用户是否已经登录,如果没有登录,发送错误信息提示用户登录。

      这样,整个产品详细信息页就完成了。不过,要使程序正常运行,还需要修改路由表,打开Global.asax.cs文件,在路由中加入以下路由:

                        routes . MapRoute (
                                " Comment1 " ,   //   Route   name
                                " Comment/AddComment/{id} " ,   //   URL   with   parameters
                                new   {   controller   =   " Comment " ,   action   =   " AddComment " ,   id = 1   }   //   Parameter   defaults
                        ) ;
 
                        routes . MapRoute (
                                " Comment " ,   //   Route   name
                                " Comment/{id}/{page} " ,   //   URL   with   parameters
10                                  new   {   controller   =   " Comment " ,   action   =   " Index " ,   page   =   1   }   //   Parameter   defaults
11                          ) ;
12   

      第1个路由指示添加评论是如何路由的,如果没有这个,则全部会按第2个路由执行,全部操作转到Index操作去了,这样就会发生错误。

转载于:https://www.cnblogs.com/muyuge/archive/2011/01/23/6333821.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解构领域驱动设计(三):领域驱动设计

在上一部分&#xff0c;分层架构的目的是为了将业务规则剥离出来在单独的领域层中进行实现。再回顾一下领域驱动设计的分层中应用层代码的实现。 Override public void pay(int orderId, float amount) {DesignerOrder order designerOrderRepository.selectByKey(orderId); …

MySQL中update一条record的过程

在MySQL中&#xff0c;update是原地更新数据&#xff0c;原地更新数据&#xff0c;原地更新数据。重要的事情说3遍。这是不同于PGSQL的。 update的具体过程是&#xff1a; (1)、先对该条record对应的索引加X锁 (2)、将修改后的数据写入到redo.log中 (3)、将修改之前的数据备…

[AX]AX2012 AIF(二):文档服务编程模型

一个完整的文档服务包含很多对象&#xff0c;以Customer服务为例&#xff0c;它包含以下对象&#xff1a; 查询AxdCustomer&#xff1a;这个query的顶层表为CustTable&#xff0c;其下Datasource包含表DirParty&#xff0c;DirParty下的Datasource则再包含表DirPersonName、表D…

安装sql server 2000时,提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作,需重起...

打开注册表编辑器&#xff0c;在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目&#xff0c;并删除它。这样就可以清除安装暂挂项目。 方法二&#xff1a; 1、添加/删除程序中彻底删除sql server。 2、将没有删除…

iOS 打包.framework(包括第三方、图片、xib、plist文件)详细步骤及需要注意的地方...

https://www.cnblogs.com/yk123/p/9340268.html // 加载自定义名称为Resources.bundle中对应images文件夹中的图片// 思路:从mainbundle中获取resources.bundleNSString *strResourcesBundle [[NSBundle mainBundle] pathForResource:”Resources” ofType:”bundle”];// 找到…

MySQL中innodb_page_cleaners详解

innodb_page_cleaners是MySQL中的刷脏线程个数&#xff0c;它的值等于innodb_buffer_pool_instances的值&#xff0c;如果innodb_page_cleaners的值大于innodb_buffer_pool_instances的值&#xff0c;那么自动的将innodb_page_cleaners调整为与innodb_buffer_pool_instances的值…

uiimagepickerviewcontroller

if(0buttonIndex) { if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { UIAlertView *alert [[UIAlertView alloc] initWithTitle:"" message:"当前设备不支持拍照功能" delegate:nil cancelButtonTitl…

关于CString的=操作符

检查自已的代码时&#xff0c;发现一个比较弱智的错误&#xff0c;是关于转码的&#xff0c;和CString的操作符有关。 为了能简单重现&#xff0c;我模拟了一下代码&#xff1a; //未有UNICODE或_UNICODE定义 USES_CONVERSION; CString sTest(_T("test中文")); s…

分布式锁的几种使用方式(redis、zookeeper、数据库)

三种方案的比较 从理解的难易程度角度&#xff08;从低到高&#xff09; 数据库 > 缓存 > Zookeeper从实现的复杂性角度&#xff08;从低到高&#xff09; Zookeeper > 缓存 > 数据库从性能角度&#xff08;从高到低&#xff09; 缓存 > Zookeeper > 数据库从…

SQL优化准则

1. 在长时间运行的查询和短查询中使用事务 如果预期有一个长时间运行的查询&#xff0c;并且有大量的数据输出时&#xff0c;开发者就应该在BEGIN TRAN 和END TRAN之间使用事务。 这样事务会在缓冲区缓存为独立事务&#xff0c;并会被分配特定内存&#xff0c;以此来提高处理…

C语言库函数--strstr()

原型&#xff1a;extern char *strstr(const char *str1, const char *str2); 需要包含的头文件&#xff1a;#include <string.h> 作用&#xff1a;用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL&#xff0c;找到了则返回str1中的位置。 …

《离散数学》双语专业词汇表 名词术语中英文索引

《离散数学》双语专业词汇表 set&#xff1a;集合 subset&#xff1a;子集 element, member&#xff1a;成员&#xff0c;元素 well-defined&#xff1a; 良定&#xff0c;完全确定 brace&#xff1a;花括号 representation&#xff1a;表示 sensible&#xff1a; 有意义的 rat…

less is more,so 只记 less

less 文件名 1.Enter键  &#xff1a;向下翻一行 2.空格键   &#xff1a;向下翻一屏 3.j键    &#xff1a;想下翻一行 4.k键    &#xff1a;向上翻一行 5.f键    &#xff1a;向下翻一屏 6.b键     &#xff1a; 向上翻一屏 7.d键    &#xff1a;向…

预祝大家2011农历新年快乐,宏“兔”大展,心想事成~

预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; 又是一年新年到&#xff0c;预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; _____________________________________________________ 以下是附带的……

MySQL中的表压缩功能

MySQL版本&#xff1a;8.0.22 os&#xff1a;linux ubuntu 语言&#xff1a;c、c 在MySQL中支持3种类型的表压缩&#xff0c;依次为&#xff1a;传统压缩、TPC压缩、字典压缩。 第一种&#xff1a;传统压缩 传统的表压缩方式是在MySQL5.0.7之前使用的&#xff0c;现在已经废…

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

本文目录1. Net下日志记录2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 2.4 日志类型介绍 2.5 产生的日志文件3. 基于Microsoft.Extensions.Logging封装 3.1 添加引用Microsoft.Extensions.Logging 3.2 实现…

strcasecmp()--忽略大小写比较字符串

strcasecmp()的功能是&#xff1a;忽略大小写比较字符串 头文件 #include <strings.h> 函数原型&#xff1a;int strcasecmp(const char *s1, const char *s2); 函数功能: 用来比较参数s1和s2字符串&#xff0c;比较时会自动忽略大小写的差异。 返回值: 若参数字符串…

NDK 获取android的imei和serial number

1&#xff0c;获取imei int setAndroidDeviceID(JNIEnv *env, jobject obj,jobject mContext) {if(mContext 0){return -1;}jclass cls_context (*env)->FindClass(env, "android/content/Context");if(cls_context 0){return -1;}jmethodID getSystemService …

《JS高级程序设计》PART3.对象基础

3.2对象应用 对象废除&#xff1a;如果一个对象有2个及以上引用&#xff0c;则要正确的废除该对象&#xff0c;必须将其所有引用都设置为null。 js和java一样&#xff0c;有垃圾回收机制&#xff0c;会自动收回已无引用指向的对象。 早绑定和晚绑定 绑定&#xff1a;把对象的…

python迭代-如何对迭代器做切片操作

如何对迭代器做切片操作 问题举例 读取某个文件内容的100~300行内容&#xff0c;我们是否可以使用 类似列表切片的方式得到一个100~300行文件内容的生成器 分析 列表的切片操作其实是在重载方法__getItem__方法 可以通过file.readlines()后再做切片&#xff0c;内存会加载整个文…