【ASP.NET基础】简单企业产品展示网站--产品编辑CRUD

news/2024/5/8 21:42:10/文章来源:https://blog.csdn.net/weixin_30594001/article/details/98647168

摘要:本文记录创建一个小的、简单的产品网站的步骤。

一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎、Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEditor使用,Bootstrap的简单使用。【点击查看网站效果】

二,网站基本框架:新建项目ProductWeb ,并完成基本框架的搭建(SQLHelper,ckEditor,Common_Nvelocity,Bootstrap等添加到项目中)。并创建ProductWebDB 。【下载基本模板框架】

三,在基本模板的基础上,添加后台 产品列表页面(ProductList_Admin.html)

  A,新增数据库: ProduceWebDB 并新建表ProCategories、Products

USE [ProduceWebDB]
GO
/****** Object:  Table [dbo].[ProCategories]    Script Date: 2015/6/2 15:54:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ProCategories]([CateID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,[CateName] [varchar](250) NOT NULL
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Products]    Script Date: 2015/6/2 15:54:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Products]([ProID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,[ProName] [nvarchar](250) NOT NULL,[ProImagePath] [nvarchar](max) NOT NULL,[ProIntroduce] [text] NOT NULL,[ProCateID] [bigint] NOT NULL,[AddTime] [datetime] NULL,[AddIP] [nchar](18) NULL,[IsDelete] [bit] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO
ALTER TABLE [dbo].[Products] ADD  CONSTRAINT [DF_Products_CreateTime]  DEFAULT (getdate()) FOR [AddTime]
GO
ALTER TABLE [dbo].[Products] ADD  CONSTRAINT [DF_Products_IsDelete]  DEFAULT ((0)) FOR [IsDelete]
GO
View Code

  B,项目新增ProductList_Admin.ashx一般处理程序 , 在Templates/Admin下添加对应的 ProductList_Admin.html 页面 ,在后台显示产品列表。

Templates/Admin/Head.html: 相当于模板页的页头部分,用Bootstrap导航组件 其他页面通过#parse("Head.html")调用

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html;" charset="gb2312" /><!-- 这个属性主要是设置浏览器优先使用什么模式来渲染页面的--><!-- #下面的meta标签告诉IE浏览器,IE8/9及以后的版本都会以最高版本IE来渲染页面。  --><meta http-equiv="X-UA-Compatible" content="IE=edge" /><!--移动设备都是这Viewport里面打开,width=device-width表示打开页面默认和设备一致,initial-scale=1表示页面不进行缩放   --><meta name="viewport" content="width=device-width, initial-scale=1" /><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>后台管理</title><!-- Bootstrap --><!--<link href="css/bootstrap.min.css" rel="stylesheet"/>--><!-- 新 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css" /><!--低版本浏览器如果支持HTML5需要添加以下js--><!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!-- WARNING: Respond.js doesn't work if you view the page via file:// --><!--[if lt IE 9]><script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="http://cdn.bootcss .com/respond.js/1.4.2/respond.min.js"></script><![endif]--><!--鼠标悬停弹出下拉菜单--><style type="text/css">.navbar .nav > li .dropdown-menu {margin: 0;}.navbar .nav > li:hover .dropdown-menu {display: block;}.navbar .nav > li .dropdown-menu > li:hover {font-size: larger;}</style></head>
<body><!-- --导航条  默认高度50px, 固定在顶部 --><nav class="navbar navbar-default .navbar-fixed-top"><div class="container-fluid"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><!--当浏览器宽度变窄的时候会显示这个Button按钮,并且会把data-target中的div中ul收缩导航到Button下方--><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"><!--定义小按钮的样式--><span class="sr-only">Toggle navigation</span><!-- 页面变窄时 , 按钮的3条横线 --><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><!--Logo位置--><a class="navbar-brand" href="http://www.cnblogs.com/chengzish/">后台管理</a></div><!-- Collect the nav links, forms, and other content for toggling --><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><!--导航条内容--><li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li><li><a href="#">成功案例编辑</a></li><li><a href="#">新闻活动编辑</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">服务编辑<span class="caret"></span></a><ul class="dropdown-menu" role="menu"><li><a href="#">软件定制编辑</a></li><li class="divider"></li><li><a href="#">外包服务编辑</a></li><li class="divider"></li><li><a href="#">咨询服务编辑</a></li></ul></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">OA系统解决方案编辑<span class="caret"></span></a><ul class="dropdown-menu" role="menu"><li><a href="#">员工考勤系统编辑</a></li><li class="divider"></li><li><a href="#">薪资结算系统编辑</a></li><li class="divider"></li><li><a href="#">门禁管理系统编辑</a></li><li class="divider"></li><li><a href="#">APP开发编辑</a></li></ul></li></ul><!--搜索表单--><form class="navbar-form navbar-left" role="search"><div class="form-group"><input type="text" class="form-control" placeholder="Search" /></div><button type="submit" class="btn btn-default">搜索</button></form><ul class="nav navbar-nav navbar-right"><li><a href="#">Git Fork</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">联系我们编辑<span class="caret"></span></a><ul class="dropdown-menu" role="menu"><li><a href="#">地址</a></li><li><a href="#">电话</a></li><li><a href="#">邮箱</a></li><li class="divider"></li><li><a href="#">微信</a></li></ul></li></ul></div><!-- /.navbar-collapse --></div><!-- /.container-fluid --></nav>
View Code

Templates/Admin/Foot.html: 相当于模板页的页头部分,标注版权信息,其他页面通过#parse("Foot.html")

<div id="footer" class="container"><nav class="navbar navbar-default navbar-fixed-bottom"><div class="navbar-inner navbar-content-center"><p class="text-muted credit" style="padding: 10px; text-align: center">Copyright @2014-2015 By 橙子科技 All Rights Reserved.</p></div></nav>
</div><!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script><!-- Bootstrap核心js依赖于jQuery,所以要先引用jQuery-->
<!-- Include all compiled plugins (below), or include individual files as needed -->
<!-- <script src="js/bootstrap.min.js"></script>--><!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
</body>
</html>
View Code

Templates/Admin/ProductList_Admin.html:  产品列表展示页面,遍历显示产品数据

#parse("Admin/Head.html")<h2>产品列表维护</h2><div style="width: 70%; text-align: center; margin-left: 15%;"><table class="table table-striped table-bordered table-hover"><tr><td>产品名称</td><td>产品类别</td><td>编辑</td><td>删除</td></tr>#foreach($Pro in $data.Products)<tr><td>$Pro.ProName</td><td>$Pro.CateName /></td><td><a href="ProductEdit.html?action=edit&id=$Pro.ProID">编辑</a></td><td><a href="ProductEdit.html?action=delete&id=$Pro.ProID">删除</a></td></tr>#end</table>
</div>#parse("Admin/Foot.html")
View Code

ProductList_Admin.ashx: 从数据库中读取产品信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;namespace ProductWeb
{/// <summary>/// ProductList_Admin 后台显示产品列表/// </summary>public class ProductList_Admin : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/html";//从DB中选出产品信息string sql = "SELECT [ProID],[ProName],[ProImagePath],[ProIntroduce],b.[CateName] as CateName  FROM [dbo].[Products]  as a left join [dbo].[ProCategories] as b on a.ProCateID=b.CateID ";SQLHelper sqlH = new SQLHelper();DataTable dt = sqlH.ExecuteQuery(sql, CommandType.Text);var data = new { PageTitle = "产品列表", Products = dt.Rows };string strHtml = Common_Nvelocity.RenderHTML("Admin/ProductList_Admin.html", data);context.Response.Write(strHtml);}public bool IsReusable{get{return false;}}}
}
View Code

C,Ctrl+F5运行程序,查看 ProductList_Admin.ashx 读出了DB中的数据:

四,添加产品编辑页面(ProductEdit.html)点击ProductList_Admin.html中的“编辑”跳转到ProductEdit.html编辑页面. 

  PorductEdit.ashx根据传递过来的Action(edit,delete,addnew)进行编辑、删除、新增操作。

  A, 更新webconfig允许写入 html 标签

<system.web><compilation debug="true" targetFramework="4.0" /><httpRuntime requestValidationMode="2.0"/></system.web>
View Code

  B, 添加ProductEdit.html 页面 (1,三个隐藏控件分别记录当前页面是否是首次加载,点击“保存”按钮需要执行的操作,传递过来的id的值 2, 注意下拉列表的实现)

#parse("Admin/Head.html")<script src="../../ckeditor/ckeditor.js"></script><div style="width: 70%; text-align: left; margin-left: 15%;">#if($data.ActionEdit=="edit")<h2 class="text-center">产品编辑</h2>#elseif ($data.ActionEdit=="delete")<h2 class="text-center">产品删除 </h2>#elseif ($data.ActionEdit=="addnew")<h2 class="text-center">产品新增</h2>#end<form method="post" action="ProductEdit.ashx"><!--三个隐藏,IspostBack 记录页面是否首次加载,action 记录提交按钮后是需要新增还是编辑,txtProIDHiddden 隐藏当前编辑的id  --><input type="hidden" name="IsPostBack" value="true" /><input type="hidden" name="txtaction" value="$data.ActionEdit" /><input type="hidden" name="txtProIDHiddden" value="$data.Product.ProID" /><table class="table table-striped table-bordered"><tr><td>产品名称:</td><td><input type="text" name="txtProName" value="$data.Product.ProName" /></td></tr><tr><td>产品分类:</td><td><select name="txtProCateID">#foreach($cate in $data.Categories)#if($cate.CateID==$data.Product.ProCateID)<option value="$cate.CateID" selected="selected">$cate.CateName</option>#else<option value="$cate.CateID">$cate.CateName</option>#end#end</select></td></tr><tr><td>产品图片:</td><td><img id="ProImg" src="$data.Product.ProImagePath" class="img-rounded" /></td></tr><tr><td>产品介绍:</td><td><textarea id="idProIntroduce" name="txtProIntroduce">$data.Product.ProIntroduce </textarea></td></tr><tr><td colspan="2" style="text-align: center"><input type="submit" value="保存" class="btn btn-primary" /><a href="ProductList_Admin.ashx" class="btn btn-default">返回</a></td></tr></table></form><div style="width: 70%; text-align: center; margin-left: 15%;"><script type="text/javascript">var txtIntro = document.getElementById("idProIntroduce");CKEDITOR.replace(txtIntro);</script>
#parse("Admin/Foot.html")
View Code

  C, 添加ProductEdit.ashx 处理新增、编辑、删除操作,并把数据交给Nvelocity模板从而加载到前台页面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;namespace ProductWeb
{/// <summary>/// ProductEdit Product编辑页面 /// </summary>public class ProductEdit : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/html";string strHtml = "";string sqlCates = "SELECT [CateID],[CateName] FROM [dbo].[ProCategories]";SQLHelper sqlH = new SQLHelper();DataTable dtCates = sqlH.ExecuteQuery(sqlCates, CommandType.Text);//[ProID],[ProName],[ProImagePath],[ProIntroduce],[ProCateID],b.[CateName] as CateName,b.[CateID] as CateID  FROM [Products]  as a left join [ProCategories] as b on a.ProCateID=b.CateID and a.ProID=@strProID ";     //
            ////定义Product,并给一个默认的控制 var ProductOriginal = new { ProID = 0, ProName = "", ProImagePath = "", ProIntroduce = "", CateName = "", CateID = "" };//页面首次加载 , 显示Product信息if (string.IsNullOrEmpty(context.Request.Form["IsPostBack"]) == true){string strProID = context.Request.QueryString["id"];   // 点击 编辑 按钮,传递过来 action 和 id值string strAction = context.Request.QueryString["action"] == null ? "" : context.Request.QueryString["action"].ToString().ToLower(); //  点击保存后,具体是 edit、 delte还是 add,  保存在页面的隐藏控件中string strPageTitle = "产品操作";  //defaultif (!string.IsNullOrEmpty(strProID))   // id 存在
                {//从DB中选出 id 对应的Product 信息SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@strProID",strProID)};if (strAction == "edit"){strPageTitle = "产品编辑";}else if (strAction == "delete"){strPageTitle = "产品删除";}else if (strAction == "addnew"){strPageTitle = "产品新增";}//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){// 产品存在,显示产品信息var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = dtPro.Rows[0], ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{// 不存在,显示编辑页面var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = ProductOriginal, ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}else{//显示编辑页面var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = ProductOriginal, ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}//点击了 submit 按钮,根据传递过来的action进行操作 update/deleteelse{string strAction = context.Request.Form["txtaction"];if (!string.IsNullOrEmpty(strAction)){string strInfo = "";if (strAction == "edit"){string strProID = context.Request.Form["txtProIDHiddden"];string strProName = context.Request.Form["txtProName"];string strProCateID = context.Request.Form["txtProCateID"];//string strProImagePath = context.Request.Form["strProImgPath"];string strProIntroduce = context.Request.Form["txtProIntroduce"];//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){//updatestring sqlUpdate = "update [Products] set [ProName]=@ProName,[ProIntroduce]=@ProIntroduce,[ProCateID]=@ProCateID where [IsDelete]=0 and [ProID]=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProName",strProName),new SqlParameter("@ProCateID",strProCateID),new SqlParameter("@ProIntroduce",strProIntroduce),new SqlParameter("@ProID",strProID)};int numSuccUpd = 0;numSuccUpd = sqlH.ExecuteNonQuery(sqlUpdate, sqlParas, CommandType.Text);if (numSuccUpd > 0){strInfo = "更新成功";DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{strInfo = "更新失败";DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}else if (strAction == "delete"){string strProID = context.Request.Form["txtProIDHiddden"];//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){string sqlUpdate = "update [Products] set [IsDelete]=1  where  [ProID]=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProID",strProID)};int numSuccUpd = 0;numSuccUpd = sqlH.ExecuteNonQuery(sqlUpdate, sqlParas, CommandType.Text);if (numSuccUpd > 0){strInfo = "删除成功";context.Response.Redirect("productlist_admin.ashx");}else{DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品删除", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}else if (strAction == "addnew"){//写入数据库string strProName = context.Request.Form["txtProName"];string strProCateID = context.Request.Form["txtProCateID"];string strProImagePath = "updloadFiles/3.jpg";string strProIntroduce = context.Request.Form["txtProIntroduce"];if (string.IsNullOrEmpty(strProName) || string.IsNullOrEmpty(strProCateID) || string.IsNullOrEmpty(strProIntroduce)){strInfo = "不允许为空";var data = new { PageTitle = "产品新增", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{string sqlInsert = "  insert into [Products]([ProName],[ProCateID],[ProIntroduce],[ProImagePath]) values(@ProName,@ProCateID,@ProIntroduce,@ProImagePath) ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProName",strProName),new SqlParameter("@ProCateID",strProCateID),new SqlParameter("@ProIntroduce",strProIntroduce),new SqlParameter("@ProImagePath",strProImagePath)};int numSucc = sqlH.ExecuteNonQuery(sqlInsert, sqlParas, CommandType.Text);if (numSucc == 1){strInfo = "添加成功";context.Response.Redirect("productlist_admin.ashx");}else{strInfo = "添加失败";var data = new { PageTitle = "产品新增", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}}else{var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = "" };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}context.Response.Write(strHtml);}public DataTable dtGetProductByID(string strProID){SQLHelper sqlH = new SQLHelper();//选择出ID对应的Productstring sqlPro = "SELECT [ProID],[ProName],[ProImagePath],[ProIntroduce],[ProCateID],b.[CateName] as CateName,b.[CateID] as CateID  FROM [Products]  as a left join [ProCategories] as b on a.ProCateID=b.CateID where [IsDelete]=0 and a.ProID=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProID", strProID)};DataTable dtPro = sqlH.ExecuteQuery(sqlPro, sqlParas, CommandType.Text);return dtPro;}public bool IsReusable{get{return false;}}}
}
View Code

---------------------------------------------------实现效果: 新增 AddNew---------------------------------------------------

----------------------------------------------------实现效果:  编辑 Edit-------------------------------------------------------

----------------------------------------------------实现效果:  删除 Delete-----------------------------------------------------

五,实现图片上传和分页 (知识点:1,From表单设置enctype属性 2,文件上传并SaveAs到Server.MapPath  3,Row_Number()进行分页

  A,分别更新ProductEdit.html和ProductEdit.ashx 实现图片的上传和更新(图片存储在服务器,图片名称存储DB)

Templates/Admin/ProductEdit.html:  Form表单添加enctype="multipart/form-data"属性 ,图片src读取图片路径

#parse("Admin/Head.html")<script src="../../ckeditor/ckeditor.js"></script><div style="width: 70%; text-align: left; margin-left: 15%;">#if($data.ActionEdit=="edit")<h2 class="text-center">产品编辑</h2>#elseif ($data.ActionEdit=="delete")<h2 class="text-center">产品删除 </h2>#elseif ($data.ActionEdit=="addnew")<h2 class="text-center">产品新增</h2>#end<form method="post" action="ProductEdit.ashx" enctype="multipart/form-data"><!--三个隐藏,IspostBack 记录页面是否首次加载,action 记录提交按钮后是需要新增还是编辑,txtProIDHiddden 隐藏当前编辑的id  --><input type="hidden" name="IsPostBack" value="true" /><input type="hidden" name="txtaction" value="$data.ActionEdit" /><input type="hidden" name="txtProIDHiddden" value="$data.Product.ProID" /><table class="table table-striped table-bordered"><tr><td>产品名称:</td><td><input type="text" name="txtProName" value="$data.Product.ProName" /></td></tr><tr><td>产品分类:</td><td><select name="txtProCateID">#foreach($cate in $data.Categories)#if($cate.CateID==$data.Product.ProCateID)<option value="$cate.CateID" selected="selected">$cate.CateName</option>#else<option value="$cate.CateID">$cate.CateName</option>#end#end</select></td></tr><tr><td>产品图片:</td><td>#if ($data.ActionEdit=="addnew")<input type="file" name="ProductImage" value="上传图片" />#else<img id="ProImg" src="../../uploadFiels/$data.Product.ProImagePath" class="img-rounded" style="width: 40px; height: 40px" /><input type="file" name="ProductImage" value="更新图片" />#end</td></tr><tr><td>产品介绍:</td><td><textarea id="idProIntroduce" name="txtProIntroduce">$data.Product.ProIntroduce </textarea></td></tr><tr><td colspan="2" style="text-align: center"><input type="submit" value="保存" class="btn btn-primary" /><a href="ProductList_Admin.ashx" class="btn btn-default">返回</a></td></tr></table></form><br /><br /><br /><script type="text/javascript">var txtIntro = document.getElementById("idProIntroduce");CKEDITOR.replace(txtIntro);</script>
#parse("Admin/Foot.html")
View Code

ProductEdit.ashx:   实现图片保存到uploadfiles文件夹,图片名称保存到DB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.IO;namespace ProductWeb
{/// <summary>/// ProductEdit Product编辑页面 /// </summary>public class ProductEdit : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/html";string strHtml = "";string sqlCates = "SELECT [CateID],[CateName] FROM [dbo].[ProCategories]";SQLHelper sqlH = new SQLHelper();DataTable dtCates = sqlH.ExecuteQuery(sqlCates, CommandType.Text);//[ProID],[ProName],[ProImagePath],[ProIntroduce],[ProCateID],b.[CateName] as CateName,b.[CateID] as CateID  FROM [Products]  as a left join [ProCategories] as b on a.ProCateID=b.CateID and a.ProID=@strProID ";     //
            ////定义Product,并给一个默认的控制 var ProductOriginal = new { ProID = 0, ProName = "", ProImagePath = "", ProIntroduce = "", CateName = "", CateID = "" };//页面首次加载 , 显示Product信息if (string.IsNullOrEmpty(context.Request.Form["IsPostBack"]) == true){string strProID = context.Request.QueryString["id"];   // 点击 编辑 按钮,传递过来 action 和 id值string strAction = context.Request.QueryString["action"] == null ? "" : context.Request.QueryString["action"].ToString().ToLower(); //  点击保存后,具体是 edit、 delte还是 add,  保存在页面的隐藏控件中string strPageTitle = "产品操作";  //defaultif (!string.IsNullOrEmpty(strProID))   // id 存在
                {//从DB中选出 id 对应的Product 信息SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@strProID",strProID)};if (strAction == "edit"){strPageTitle = "产品编辑";}else if (strAction == "delete"){strPageTitle = "产品删除";}else if (strAction == "addnew"){strPageTitle = "产品新增";}//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){// 产品存在,显示产品信息var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = dtPro.Rows[0], ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{// 不存在,显示编辑页面var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = ProductOriginal, ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}else{//显示编辑页面var data = new { PageTitle = strPageTitle, Categories = dtCates.Rows, Product = ProductOriginal, ActionEdit = strAction };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}//点击了 submit 按钮,根据传递过来的action进行操作 update/deleteelse{string strAction = context.Request.Form["txtaction"];if (!string.IsNullOrEmpty(strAction)){string strInfo = "";if (strAction == "edit"){string strProID = context.Request.Form["txtProIDHiddden"];string strProName = context.Request.Form["txtProName"];string strProCateID = context.Request.Form["txtProCateID"];string strProImageName = ""; //文件名string strProIntroduce = context.Request.Form["txtProIntroduce"];//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){//上传文件HttpPostedFile proImg = context.Request.Files["ProductImage"];  //获得客户端上传图片信息string imgServerPath = context.Server.MapPath("~/uploadFiels/"); //项目中 uploadFiles路径string strTimeNow = DateTime.Now.ToString("yyyyMMddHHmmssfff");strProImageName = strTimeNow + Path.GetExtension(proImg.FileName);if ((Path.GetExtension(proImg.FileName) == ".jpg" || Path.GetExtension(proImg.FileName) == ".png") && proImg.ContentLength < 102400){proImg.SaveAs(imgServerPath + strProImageName);       //上传
                            }//update DBstring sqlUpdate = "update [Products] set [ProName]=@ProName,[ProIntroduce]=@ProIntroduce,[ProCateID]=@ProCateID,[ProImagePath]=@ProImagePath where [IsDelete]=0 and [ProID]=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProName",strProName),new SqlParameter("@ProCateID",strProCateID),new SqlParameter("@ProIntroduce",strProIntroduce),new SqlParameter("@ProID",strProID),new SqlParameter("@ProImagePath",strProImageName)};int numSuccUpd = 0;numSuccUpd = sqlH.ExecuteNonQuery(sqlUpdate, sqlParas, CommandType.Text);if (numSuccUpd > 0){strInfo = "更新成功";DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{strInfo = "更新失败";DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}else if (strAction == "delete"){string strProID = context.Request.Form["txtProIDHiddden"];//选择出ID对应的ProductDataTable dtPro = dtGetProductByID(strProID);int numExist = 0;numExist = dtPro.Rows.Count;if (numExist > 0){string sqlUpdate = "update [Products] set [IsDelete]=1  where  [ProID]=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProID",strProID)};int numSuccUpd = 0;numSuccUpd = sqlH.ExecuteNonQuery(sqlUpdate, sqlParas, CommandType.Text);if (numSuccUpd > 0){strInfo = "删除成功";context.Response.Redirect("productlist_admin.ashx");}else{DataTable dtProNew = dtGetProductByID(strProID);var data = new { PageTitle = "产品删除", Categories = dtCates.Rows, Product = dtProNew.Rows[0], ActionEdit = strAction, InfoMeg = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}else if (strAction == "addnew"){//写入数据库string strProName = context.Request.Form["txtProName"];string strProCateID = context.Request.Form["txtProCateID"];string strProImageName = "";string strProIntroduce = context.Request.Form["txtProIntroduce"];if (string.IsNullOrEmpty(strProName) || string.IsNullOrEmpty(strProCateID) || string.IsNullOrEmpty(strProIntroduce)){strInfo = "不允许为空";var data = new { PageTitle = "产品新增", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}else{//上传文件HttpPostedFile proImg = context.Request.Files["ProductImage"];  //获得客户端上传图片信息string imgServerPath = context.Server.MapPath("~/uploadFiels/"); //项目中 uploadFiles路径string strTimeNow = DateTime.Now.ToString("yyyyMMddHHmmssfff");strProImageName = strTimeNow + Path.GetExtension(proImg.FileName);if ((Path.GetExtension(proImg.FileName) == ".jpg" || Path.GetExtension(proImg.FileName) == ".png") && proImg.ContentLength < 102400){proImg.SaveAs(imgServerPath + strProImageName);       //上传
                            }// Insert DBstring sqlInsert = "  insert into [Products]([ProName],[ProCateID],[ProIntroduce],[ProImagePath]) values(@ProName,@ProCateID,@ProIntroduce,@ProImagePath) ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProName",strProName),new SqlParameter("@ProCateID",strProCateID),new SqlParameter("@ProIntroduce",strProIntroduce),new SqlParameter("@ProImagePath",strProImageName)};int numSucc = sqlH.ExecuteNonQuery(sqlInsert, sqlParas, CommandType.Text);if (numSucc == 1){strInfo = "添加成功";context.Response.Redirect("productlist_admin.ashx");}else{strInfo = "添加失败";var data = new { PageTitle = "产品新增", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = strInfo };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}}}else{var data = new { PageTitle = "产品编辑", Categories = dtCates.Rows, Product = ProductOriginal, MesgInfo = "" };strHtml = Common_Nvelocity.RenderHTML("Admin/ProductEdit.html", data);}}context.Response.Write(strHtml);}// Query Product By IDpublic DataTable dtGetProductByID(string strProID){SQLHelper sqlH = new SQLHelper();//选择出ID对应的Productstring sqlPro = "SELECT [ProID],[ProName],[ProImagePath],[ProIntroduce],[ProCateID],b.[CateName] as CateName,b.[CateID] as CateID  FROM [Products]  as a left join [ProCategories] as b on a.ProCateID=b.CateID where [IsDelete]=0 and a.ProID=@ProID ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@ProID", strProID)};DataTable dtPro = sqlH.ExecuteQuery(sqlPro, sqlParas, CommandType.Text);return dtPro;}public bool IsReusable{get{return false;}}}
}
View Code

--------------------------图片上传-效果--------------------------------------------

  B,借助SQL的Row_Number方法进行分页, 前台页面传入页码到后台,然后查询对应页码的数据。(1,Row_Number 2,页码计算 3,根据当前页面把上一页、下一页禁用)

    分别更新ProductList_Admin.html  和 ProductList_Admin.ashx页面:

Templates/Admin/ProductList_Admin.html    调用Bootstrap分页组件

#parse("Admin/Head.html")<h2 class="text-center">产品列表维护</h2><div style="width: 70%; text-align: center; margin-left: 15%;"><table class="table table-striped table-bordered table-hover"><tr style="font-weight: bolder"><td>产品名称</td><td>产品类别</td><td>编辑</td><td>删除</td></tr>#foreach($Pro in $data.Products)<tr><td>$Pro.ProName</td><td>$Pro.CateName</td><td><a href="ProductEdit.ashx?action=edit&id=$Pro.ProID">编辑</a></td><td><a href="ProductEdit.ashx?action=delete&id=$Pro.ProID">删除</a></td></tr>#end<tr><td colspan="4" class="text-center"><nav><ul class="pagination">#if($data.PageBeforeNext.PageBefore==0)<li class="disabled">#else <li>#end<a href="Productlist_admin.ashx?Page=$data.PageBeforeNext.PageBefore" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>#foreach($pageHref in $data.PageData)<li><a href="$pageHref.Href">$pageHref.Title</a></li>#end#if($data.PageBeforeNext.PageNext>=$data.PageNums)<li class="disabled">#else <li>#end<a href="Productlist_admin.ashx?Page=$data.PageBeforeNext.PageNext" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li><li><a>共$data.PageNums页</a></li></ul></nav></td></tr><tr><td colspan="4" class="text-center"><a href="ProductEdit.ashx?action=AddNew" class="btn btn-default">新增</a></td></tr></table>
</div>#parse("Admin/Foot.html")
View Code

ProductList_Admin.ashx: 1,页数计算,理解Row_Number分页  2,生成对应的href链接传递给前台页面 3, 当前页码、页面总数、上页、下页

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;namespace ProductWeb
{/// <summary>/// ProductList_Admin 后台显示产品列表/// </summary>public class ProductList_Admin : IHttpHandler{public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/html";//从DB中选出产品信息SQLHelper sqlH = new SQLHelper();//DataTable是把数据读取出来以后放入内存中,如果数据量大的话 一次性都读出来的话就很吃内存造成系统性能很差//这时候我们就要从DB中只读取我们需要的数据就好了 , 把数据进行分页处理,只读取需要页数的数据// 一,页数计算。查询出来Product总数numAllProducts. 总页数numPages=Celling(numAllProducts/10.0) .  天花板函数的结果是  >=这个数的最小整数int numAllProducts = Convert.ToInt32(sqlH.ExecuteScalar("select count(*) from [Products] where [IsDelete]=0", CommandType.Text));int numPages = (int)Math.Ceiling(numAllProducts / 10.0);  // 5/10→1  10/10→1   11/10→2//二,生成前台页面 a 的链接地址 hrefobject[] objPageData = new object[numPages];for (int i = 0; i < numPages; i++){objPageData[i] = new { Href = "ProductList_Admin.ashx?Page=" + (i + 1).ToString(), Title = (i + 1).ToString() };}//三,根据前台传递过来的页码,查询对应页面的数据int intRowNumber = 1; //默认为第1页 1-10条数据,第2页: 11~20条数据  (intRowNumber-1)*10+1~intRowNumber*10string strPageNumber = context.Request.QueryString["Page"];if (!string.IsNullOrEmpty(strPageNumber)){intRowNumber = Convert.ToInt32(strPageNumber);  //获取传递过来的页面
            }//选择对应页面的数据string sql = @"select * from (SELECT [ProID],[ProName],[ProImagePath],[ProIntroduce],[ProCateID],b.[CateName] as CateName,b.[CateID] as CateID,ROW_NUMBER() over (order by ProID) as RowNum  FROM [Products]  as a left join [ProCategories] as b on a.ProCateID=b.CateID where [IsDelete]=0 ) as swhere s.RowNum between (@IntRowNumber-1)*10+1 and @IntRowNumber*10    ";SqlParameter[] sqlParas = new SqlParameter[] { new SqlParameter("@IntRowNumber",intRowNumber)};//string sql = "SELECT [ProID],[ProName],[ProImagePath],[ProIntroduce],b.[CateName] as CateName  FROM [dbo].[Products]  as a left join [dbo].[ProCategories] as b on a.ProCateID=b.CateID where [IsDelete]=0 ";DataTable dt = sqlH.ExecuteQuery(sql, sqlParas, CommandType.Text);//四,根据当天页码和总页面数,设置前一页和后一页var varPageBeforeNext = new { PageBefore = intRowNumber - 1, PageNext = intRowNumber + 1 };var data = new { PageTitle = "产品列表", Products = dt.Rows, PageData = objPageData, PageNums = numPages, PageBeforeNext = varPageBeforeNext };string strHtml = Common_Nvelocity.RenderHTML("Admin/ProductList_Admin.html", data);context.Response.Write(strHtml);}public bool IsReusable{get{return false;}}}
}
View Code

--------------------------------------------------分页实现效果------------------------------------------------------

 

 

 

 

总结:本文实现了产品编辑的增删查改功能,了解图片上传、分页实现等。  【Demo下载 】   

 

参考:

NVelocity 语法: http://www.cnblogs.com/hxling/archive/2011/10/23/2221918.html

Row_Number()使用: http://www.cnblogs.com/gy51Testing/archive/2012/07/26/2609832.html

 

转载于:https://www.cnblogs.com/chengzish/p/4529148.html

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

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

相关文章

记一次JavaWeb网站技术架构总结

题记工作也有几多年了&#xff0c;无论是身边遇到的还是耳间闻到的&#xff0c;多多少少也积攒了自己的一些经验和思考&#xff0c;当然&#xff0c;博主并没有太多接触高大上的分布式架构实践&#xff0c;相对比较零碎&#xff0c;随时补充(附带架构装逼词汇)。俗话说的好&…

LVS和nginx反向代理网站架构

LVS和nginx反向代理网站架构 nginx反向代理和lvs的dr都存在单点&#xff0c;要keepalived做高可用&#xff0c;但是成本高了 f 转载于:https://www.cnblogs.com/MYSQLZOUQI/p/5100056.html

【web标准设计】学习、提高、欣赏网站推荐

【web标准设计】学习、提高、欣赏网站推荐(转&#xff09;文章包含的一些粗俗、庸俗、恶心的言语可能造成您阅读后的不适感&#xff0c;请谨慎选择是否阅读。如你自愿阅读本文&#xff0c;因粗俗、庸俗、恶心的言语给您所造成的任何后果&#xff0c;本文作者不负任何责任。 华丽…

zabbix-自定义监控项(监控网站80连接数)

自定义监控项&#xff08;监控网站80连接数&#xff09; 需求&#xff1a;监控某台web的80端口连接数&#xff0c;并出图&#xff1b; 第一步&#xff1a;客户端创建脚本&#xff1a; 客户端定义脚本&#xff0c;并编辑zabbix-agent配置文件实现运行定义的脚本&#xff1b; 客户…

大型网站技术架构(一)--大型网站架构演化

转自&#xff1a;https://blog.csdn.net/chaofanwei/article/details/26865169 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向…

传统IDC 部署网站

选择IDC机房 1.选择云主机。 2.传统IDC a购买服务器 b服务器托管 c装系统 装系统 虚拟机软件 vmware workstation virtualbox hyper-v 下载&#xff1a;r.aminglinux.como 系统下载&#xff1a; http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.…

使用phpstudy一键搭建网站

在软件管理中选择要安装的服务。 安装成功以后点击一键搭建 设置域名端口号根目录等信息后点击确定 开启apache和mysql服务 打开浏览器输入域名登录网站 也可以使用在网上找到的套件进行搭建 将套件解压至phpstudy的根目录下 单击创建网站配置好域名端口根目录 单击创建数据库并…

阿里云虚拟主机建立多个网站的方法

今天有朋友问魏艾斯博客&#xff0c;如果想在一个阿里云虚拟主机里面放多个网站怎么办&#xff0c;老魏很久不碰虚拟主机了&#xff0c;研究了一下找到了解决办法&#xff0c;下面来说一下阿里云虚拟主机建立多个网站的方法。 阿里云虚拟主机只能放一个网站&#xff0c;为了能够…

服务器购买+建站流程教程——适合新手没有经验的人Chinar总结

服务器购买购买教程本文提供全图文流程&#xff0c;中文翻译。 Chinar 坚持将简单的生活方式&#xff0c;带给世人&#xff01;&#xff08;拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例&#xff09; Chinar —— 心分享、心创新&#xff01;助力快速完成…

网站seo优化过度的表现以及避免方法

因为seo而seo导致的结果很有可能就是网站优化过度&#xff0c;我不止一次看到过这样的情况&#xff1a;因为学习了部分seo教程&#xff0c;发现增加关键词密度可以适当提升排名&#xff0c;就在站内大量累加目标关键词&#xff0c;以期望达到关键词排名&#xff0c;最终的结果是…

Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能(转)...

转自&#xff1a;http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html 视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器.多媒体视频处理工具FFmpeg有非常强大…

网站整站开发小例子

之前学习的前端知识都只是局限于htmljs编写的静态网页&#xff0c;所以前几天试着加上模拟数据把前端和后台串联起来。在这个demo中&#xff0c;我运用了node.js、koa及vue.js。首先我们需要了解node.js&#xff0c;简单的说 Node.js 就是运行在服务端的 JavaScript。node.js安…

让网站Http重定向Https并进行百度Https认证

先为大家带来一点福利。阿里云最近开始发放代金券了&#xff0c;新老用户均可免费获取&#xff0c;1880元代金券&#xff0c;建议大家都领取一份&#xff0c;反正是免费领的&#xff0c;说不定以后需要呢&#xff1f;阿里云代金卷链接https://promotion.aliyun.com/ntms/yunpar…

Jekyll 动态地建立静态博客网站 (Get Started)

提前声明&#xff1a;Jekyll并不简单&#xff0c;必须要正确的看待它。把它和PHP&#xff0c;JSP和Django等放在一起讨论会减少很多失落感。它的学习曲线几乎相当于Wordpress&#xff0c;工作流程和结构也几乎一样。Jekyll与Wordpress最大不同的就是&#xff0c;没有数据库。但…

一步步带你,如何网站架构

何为大型网站 大型网站特性 既然说的是大型网站架构&#xff0c;那么架构的背后自然是解决人因面对大型网站特性而带来的问题。这样可以先给大家说下大型网站的特性&#xff0c;这些特性带来的问题就是人要解决的问题&#xff1a; 高并发、大流量&#xff1a;PV 量巨大&#xf…

什么是域名?什么网站名?什么是URL?

什么是域名&#xff1f;现实中&#xff0c;域名使用的实在太多了&#xff0c;但域名的详细含义你理解么&#xff1f;你知道域名是什么吗&#xff1f;下面&#xff0c;小编将带你详解域名的含义&#xff01; 方法/步骤 域名&#xff0c;相信大家都不默认&#xff0c;也使用过无数…

《大型网站技术架构》读书笔记一:大型网站架构演化

一、大型网站系统特点 &#xff08;1&#xff09;高并发、大流量&#xff1a;PV量巨大 &#xff08;2&#xff09;高可用&#xff1a;7*24小时不间断服务 &#xff08;3&#xff09;海量数据&#xff1a;文件数目分分钟xxTB &#xff08;4&#xff09;用户分布广泛&#xff0c;…

java 大型网站架构_大型网站架构系列:电商网站架构案例(1)

大型网站架构系列&#xff1a;电商网站架构案例(1)大型网站架构是一个系列文档&#xff0c;欢迎大家关注。本次分享主题&#xff1a;电商网站架构案例。从电商网站的需求&#xff0c;到单机架构&#xff0c;逐步演变为常用的&#xff0c;可供参考的分布式架构的原型。除具备功能…

推荐的五款市面上常用的免费CMS建站系统

我做设计也有不少年头了&#xff0c;很多客户或者朋友找我做网站的时候&#xff0c;一般问我的是用什么软件系统给他们做。大部分客户希望用的软件是免费的。所以今天给大家介绍五款我自己用过还不错的&#xff0c;重点是还免费的建站系统。 MetInfo MetInfo这个系统是一个客户…