ASP.NET关于书籍详情和删除的Demo(HttpHandler进行页面静态化[自动生成html网页]+Entity Framework通过类创建数据库+EF删查)
这次的Demo如标题所示,
首先第一步EF创建数据库
创建两个类,一个是图书类,一个是图书类别的类
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebApplication2.DAL
{
public class Book
{
[Key]
public int BookId { get; set; }
public string BookName { get; set; }
public string BookAuthor { get; set; }
public virtual BookType TypeId { get; set; }
public decimal Price { get; set; }
public DateTime Addtime { get; set; }
public string Img { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebApplication2.DAL
{
public class BookType
{
[Key]
public int TypeId { get; set; }
public string TyoeName { get; set; }
}
}
添加一个ef创建数据库
这是EF自动生成的那个类,下面画横线的是需要自己写的,第一行是一个添加数据的类,稍后会在下面附上
namespace WebApplication2.DAL
{
using System;
using System.Data.Entity;
using System.Linq;
public class Model1 : DbContext
{
//您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
//使用“Model1”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
//“WebApplication2.DAL.Model1”数据库。
//
//如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Model1”
//连接字符串。
public Model1()
: base("name=Model1")
{
Database.SetInitializer(new InitDataBase());
}
public virtual DbSet<Book> Books { get; set; }
public virtual DbSet<BookType> BookTypes { get; set; }
//为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First 模型
//的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。
// public virtual DbSet<MyEntity> MyEntities { get; set; }
}
//public class MyEntity
//{
// public int Id { get; set; }
// public string Name { get; set; }
//}
}
自动加载数据的类
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication2.DAL
{
public class InitDataBase : DropCreateDatabaseIfModelChanges<Model1>
{
protected override void Seed(Model1 context)
{
BookType bookType1 = new BookType
{
TyoeName = "武侠"
};
BookType bookType4 = new BookType
{
TyoeName = "科幻"
};
BookType bookType2 = new BookType
{
TyoeName = "文学"
};
BookType bookType3 = new BookType
{
TyoeName = "技术"
};
Book bookInfo = new Book
{
BookName = "笑傲江湖",
BookAuthor = "金庸",
TypeId = bookType1,
Price = 38,
Addtime = DateTime.Now,
Img = "1.jpg"
};
Book bookInfo1 = new Book
{
BookName = "ASP.NAT高级",
BookAuthor = "张三",
TypeId = bookType3,
Price = 88,
Addtime = DateTime.Now,
Img = "2.jpg"
};
Book bookInfo2 = new Book
{
BookName = "围城",
BookAuthor = "钱钟书",
TypeId = bookType2,
Price = 46,
Addtime = DateTime.Now,
Img = "3.jpg"
};
Book bookInfo3 = new Book
{
BookName = "末日霸权",
BookAuthor = "梦里银河",
TypeId = bookType1,
Price = 26,
Addtime = DateTime.Now,
Img = "4.jpg"
};
Book bookInfo4 = new Book
{
BookName = "萧十一郎",
BookAuthor = "古龙",
TypeId = bookType1,
Price = 39,
Addtime = DateTime.Now,
Img = "5.jpg"
};
Book bookInfo5 = new Book
{
BookName = "C#从入门到精通",
BookAuthor = "李四",
TypeId = bookType3,
Price = 66,
Addtime = DateTime.Now,
Img = "6.jpg"
};
Book bookInfo6 = new Book
{
BookName = "C#从入门到精通",
BookAuthor = "李四",
TypeId = bookType3,
Price = 66,
Addtime = DateTime.Now,
Img = "6.jpg"
};
context.Books.Add(bookInfo);
context.Books.Add(bookInfo1);
context.Books.Add(bookInfo2);
context.Books.Add(bookInfo3);
context.Books.Add(bookInfo4);
context.Books.Add(bookInfo5);
context.Books.Add(bookInfo6);
context.BookTypes.Add(bookType4);
context.BookTypes.Add(bookType1);
context.BookTypes.Add(bookType2);
context.BookTypes.Add(bookType3);
}
}
}
一个index.aspx页面前台和后台代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebApplication2.Index" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<th scope="col">图书编号</th>
<th scope="col">图书名称</th>
<th scope="col">图书价格</th>
<th scope="col">作者</th>
<th scope="col">类型</th>
<th scope="col">图片</th>
<th scope="col">上架时间</th>
<th scope="col">操作</th>
</tr>
<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
<ItemTemplate>
<tr> <th scope="row"><%# Eval("BookId") %></th>
<td><%# Eval("BookName") %></td>
<td><%# Eval("Price") %></td>
<td><%# Eval("BookAuthor") %></td>
<td><%# Eval("TypeId.TyoeName") %></td>
<td>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# "~/images/"+ Eval("Img") %>' Width="60" Height="60" /></td>
<td><%# Eval("Addtime") %></td>
<td>
<asp:LinkButton ID="LinkButton1" runat="server" CommandArgument='<%# Eval("BookId") %>' CommandName="delete" OnClientClick="return confirm('确定删除吗?')">删除</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CommandArgument='<%# Eval("BookId") %>' CommandName="xainq">详情</asp:LinkButton>
</td>
</tr>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</div>
</form>
</body>
</html>
后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplication2.DAL;
namespace WebApplication2
{
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
select();
}
}
private void select()
{
using (Model1 db = new Model1())
{
var list = db.Books.ToList();
Repeater1.DataSource = list;
Repeater1.DataBind();
}
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
//LinkButton的CommandName,就是操作的标记
string pand = e.CommandName;
int id = Convert.ToInt32(e.CommandArgument);
if (pand == "delete")
{
using (Model1 db = new Model1())
{
var sc = db.Books.FirstOrDefault(s => s.BookId == id);
db.Books.Remove(sc);
db.SaveChanges();
select();
}
}
if (pand == "xainq")
{
Response.Redirect("New/Info_" + (id - 1) + ".html");
}
}
}
}
这里还需要做一个模型的html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<img src="../images/{$Img}" />
<p>图书名称:{$BookName}</p>
<p>图书价格:{$Price}</p>
</body>
</html>
再来一个handler的类,这个类是自动生成网页的
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using WebApplication2.DAL;
namespace WebApplication2.BLL
{
public class Handler : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
string url = context.Request.RawUrl;
int last = url.LastIndexOf("_");
int dot = url.LastIndexOf(".");
int newId = int.Parse(url.Substring(last + 1, dot - last - 1)) ;
string userFilePath = context.Server.MapPath("~/NEW/info_" + newId + ".html");
if (!File.Exists(userFilePath))
{
using (Model1 bd = new Model1())
{
List<Book> news = bd.Books.ToList();
string tempPath = context.Server.MapPath("~/New/Temp.html");
//一个创建得
string tempHtml = ReadTemplate(tempPath);
//替换里面得变量
tempHtml = tempHtml.Replace("{$Img}", news[newId].Img);
tempHtml = tempHtml.Replace("{$Price}", news[newId].Price.ToString());
tempHtml = tempHtml.Replace("{$BookName}", news[newId].BookName);
//一个输出翻译得文件
WriteHtmlFile(userFilePath, tempHtml);
}
}
context.Response.WriteFile(userFilePath);
}
private void WriteHtmlFile(string userFilePath, string tempHtml)
{
FileStream fs = new FileStream(userFilePath, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.Write(tempHtml);
sw.Close();
fs.Close();
}
private string ReadTemplate(string tempPath)
{
if (!File.Exists(tempPath))
{
throw new Exception("新闻详情页面模板文件未找到!");
}
FileStream fs = new FileStream(tempPath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
string tempHtml = sr.ReadToEnd();
sr.Close();
fs.Close();
return tempHtml;
}
}
}
最后记得改配置文件
<system.webServer>
<handlers>
<add name="test" path="New/*.html" verb="*" type="WebApplication2.BLL.Handler" />
</handlers>
</system.webServer>
效果图:
删除操作
详情页面(自动生成页面)
ASP.NET关于书籍详情和删除的Demo(HttpHandler进行页面静态化[自动生成html网页]+Entity Framework通过类创建数据库+EF删查)的更多相关文章
- ASP.NET使用HttpHandler进行页面静态化(自动生成页面)
这次的Demo是,一个根页面,点击链接创建子页面,子页面都是一个Template页面进行替换的 一个根页面 <%@ Page Language="C#" AutoEventW ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- ASP.NET MVC 页面静态化操作的思路
本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...
- asp.net 页面静态化
页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System;using ...
- Asp.Net MVC页面静态化功能实现二:用递归算法来实现
上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...
- Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter
上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能.后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现 Asp.Net ...
- Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter
由于公司现在所采用的是一套CMS内容管理系统的框架,所以最近项目中有一个需求提到要求实现页面静态化的功能.在网上查询了一些资料和文献,最后采用的是小尾鱼的池塘提供的 利用ResultFilter实现a ...
- 利用ResultFilter实现asp.net mvc 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- ASP.NET MVC中,动态处理页面静态化
首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...
随机推荐
- STM32 使用IQmath实现SVPWM
IQMATH TI的片子很香,做的也很好,但是成本相对ST会更高,电机控制方面,TI无疑是做的最好的方案之一,另外TI针对没有浮点运算器的定点DSP推出了IQMATH库,在使用Q格式对数据进行分析和处 ...
- Android如何设置只有边框背景透明的背景呢?
很简单,只需要新建一个 drawable 文件 <?xml version="1.0" encoding="utf-8"?> <shape x ...
- [hdu5402 Travelling Salesman Problem]YY
题意:给一个n*m的矩形,每个格子有一个非负数,求一条从(1,1)到(n,m)的路径(不能经过重复的格子),使得经过的数的和最大,输出具体的方案 思路:对于row为奇数的情况,一行行扫下来即可全部走完 ...
- Mysql 常用函数(20)- ceiling 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html ceiling 的作用 向上取整,ceil 函数一 ...
- SpringMVC 设置全局DateTime json返回格式
对于部分返回DateTime的项目,只需要在指定属性上添加@JsonSerialize 使用自定义的json转换格式即可自定义返回DateTime格式 但是对于项目中返回有多个DateTime字段来说 ...
- 判断对象oStringObject是否为String
1.操作符 (1)typeof操作符 格式:result=typeof variable 返回值: undefined 值未定义 boolean 布尔值 string 字符串 number 数值 ob ...
- python字符串str
字符串str常用操作方法(都会产生新的数据) 1.取值: (1)索引:s[0] (2)切片:s[起始索引:结束索引:步长] 起始索引为0,可以省略 s最后一个索引可以取-1 结束索引省略,默认取到最后 ...
- 你还不了解基于session的授权认证吗?
前言 在漫长的开发过程中,权限认证是一个永恒不变的话题,随着技术的发展,从以前的基于sessionId的方式,变为如今的token方式.session常用于单体应用,后来由于微服务的兴起,分布式应用占 ...
- DPDK开发环境搭建(学会了步骤适合各版本)
一.版本的选择 首先要说明的是,对于生产来说DPDK版本不是越高越好,如何选择合适的版本? 1.要选择长期支持的版本LTS(Long Term Support) 2.根据当前开发的系统环境选择 可以在 ...
- 使用CountDownLatch等待多线程
前言 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有一个列表的大量数据等待处理,最后全部处理完毕后返回处理结果.普通做法就是从头遍历,一个个顺序执行,这 ...