我们访问直接访问静态页面不仅可以降低数据库的压力,而且也可以降低服务器的压力,静态页面比缓存效果更佳
MVC页面静态化怎么实现:
场景:在一些数据不怎么变动的页面我们可以做页面静态化处理,比如有些页面样式,模板都一样,仅仅是数据不一样。比如房源页面,假如有十套房源,每套房源都有固定的Id编号,为了向用户展示这些房源信息, 一般情况下都是在一个模板页面中写好固定的样式,然后根据不同的房源编号来查询不同的图片,将查询出来的图片放入到模板页面中去的
比如在MVC中是这样处理的: /Home/Fangyuan/1 , /Home/Fangyuan/2 , /Home/Fangyuan/3 , /Home/Fangyuan/4 , /Home/Fangyuan/5 ....等等
既然是这样,那么我们就可以根据这个规则将编号为1,2,3,4,5的这些房源生成5个HTML页面
下面是演示下做法。就不具体实现了。
Test.cshtml 模板页 (主要供我们读取,生成静态页面的html字符串)
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Test</title>
</head>
<body>
<div>
@Model
</div>
</body>
</html>
控制器
using System.IO;
using System.Web.Mvc;
namespace WebApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index() //生成静态页
{
var model = "Hello";
//将model数据传递到Test.cshtml模板视图中展示,然后读取这个Test.cshtml模板内容,生成HTML字符串返回
var viewHtml = RenderViewToString(this.ControllerContext, "~/Views/Home/Test.cshtml", model);
//将视图html字符串写入到一个Test.html文件中(生成html文件后我们想怎么用就怎么用啦,比如一个<a>标签直接指向这个html文件)
System.IO.File.WriteAllText(@"C:\Users\Fanbin\Desktop\测试\Solution1\WebApp\"+ "Test.html", viewHtml);
return Content("OK");
}
/// <summary>
/// 读取视图内容,返回html字符串
/// </summary>
/// <param name="context">控制器上下文</param>
/// <param name="viewPath">视图模板路径</param>
/// <param name="model">数据模型(将数据填充到视图模板中)</param>
/// <returns></returns>
static string RenderViewToString(ControllerContext context, string viewPath, object model = null)
{
//使用指定的控制器上下文和母版视图来查找指定的视图
ViewEngineResult viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
if (viewEngineResult == null)
{
//如果指定视图找不到则抛出异常
throw new FileNotFoundException("View" + viewPath + "cannot be found.");
}
var view = viewEngineResult.View;
context.Controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
var ctx = new ViewContext(context, view, context.Controller.ViewData, context.Controller.TempData, sw);
view.Render(ctx, sw);
return sw.ToString();
}
}
}
}
因为html静态页面是直接生成到网站的根目录下面的,所有我们可以直接调用
http://localhost:7328/Test.html