本来是用asp.net webpages做的博客网站,数据库用了一个陌生的本地数据库,只是觉得用起来很爽快,用新鲜的东西有一种刺激。后来数据库挂了,估计是存某个字段的时候出了问题,可是新鲜的东西,也不知道用什么工具可以查,只好怪自己太年轻。费了一番力气,总算是把数据挽救回来,突然意识到阿里云那边又快到期了。

不打算续租了,备案又麻烦,干脆就改成静态,挂GitHub吧。

关于GitHub上建站的方法直接看这里 https://pages.github.com/

建完之后设置CNAME和A Record绑定好域名。

之后就可以用Git来上传页面了,还可以使用Jekyll来制作博客。但是我是不懂那些的,技能树点的不一样,也懒得为了一个博客去学另一颗树上的东西。

追溯当时用webpages的原因,其实也是因为Razor,所以计划落定,用Razor做模版,Markdown做博文编辑,最后生成html。还需要把博文记录下来,随便用什么都可以,就直接存本地文件了,换言之这文件就成了我网站的数据库,为了以后检查方便就用文本文件。

1、Razor模板

2、Markdown编辑

3、Json存档

这样定好之后,创建解决方案,WPF项目模板,NuGet添加RazorEngine、MarkdownSharp、NewtonsoftJson,创建一个窗体,Page导航,两个Page,分别是目录页和内容页。

目录页是一个ListView,列出所有的文章,创建Article类,有属性Title, Content, Author, Time, Description, Link。Link是生成之后的存放的静态页面的路径,可以带/符号。

目录页上可以新建和删除文章,右下角是导出按钮,点击生成整站的页面。因为是博客站,所以肯定有两类页面,也是目录页和博文内容页。目录页是根路径下的index.html, 内容页将依据编辑时候录入的Link属性,生成对应的路径,并在改路径下创建index.html,于是你访问的时候可以是这个样子http://localhost/2015/1/1/link/

双击ListViewItem,也就是其中一篇文章,Page Navigate到内容页,在内容页你可以编辑文章,左边是编辑界面右边是预览界面。编辑采用Markdown语法。

Save保存,Back按钮导航回上一页。

这里我在Save的时候会序列化成JSON写入本地文件,需要妥善保存此文件。

在目录页进行导出操作的时候,会读取模板文件,模板文件有两个,请看下图

编译后使用的时候需要确保Template目录下有这两个文件。后缀是cshtml,虽然可以是任意后缀,但cshtml能得到vs编辑器的帮助,模板中使用razor语法调用@Model中的属性,自定义前端标签来进行布局。在Index.cshtml中,Model就是List<Article>,在Detail.cshtml中,Model是Article。

以文章页面的导出为例,关键代码如下:

Markdown mk = new Markdown();
string content = mk.Transform(article.Content);//markdown转换html
var model = new
{
ID= article.ID,
Title = article.Title,
Content = content,
Link = article.Link,
WriteTime = article.WriteTime,
Description = article.Description,
Author = article.Author,
};
string text = Engine.Razor.RunCompile(WebSource.Instance.DetailTemplate, "templateDetail", null, model);//razor转换html
string outputFilePath = string.Format("{0}/output/{1}", AppDomain.CurrentDomain.BaseDirectory, article.Link);
Directory.CreateDirectory(outputFilePath);//创建目录
File.WriteAllText(outputFilePath + "/index.html", text);//写入文件

最后生成的整站页面在output目录下。

工具完成,花了一个多小时的时间。嗯,Razor用来做代码生成确实很好使。

下面是第一个试验品

http://ifchen.com/

用Razor做静态页面生成器的更多相关文章

  1. 做HTML静态页面时遇到的问题总结

    1. 如果所示,问题:“首页”和“闲置”文字部分位于table中部 解决方法:需要取消vertical-align:middle属性,将其设置为vertical-align:top,并将文本的高度改为 ...

  2. 静态内容生成器——Wyam

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天继续静态网站的话题,介绍我选用的一个使用.NET开发的静态内容生成器--Wyam. ...

  3. vuejs服务端渲染更好的SEO,SSR完全指南Nuxt.js静态站生成器

    vuejs服务端渲染更好的SEO,SSR完全指南Nuxt.js静态站生成器SSR 完全指南https://cn.vuejs.org/v2/guide/ssr.html在 2.3 发布后我们发布了一份完 ...

  4. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  5. WEB页面采集器编写经验之一:静态页面采集器

    严格意义来说,采集器和爬虫不是一回事:采集器是对特定结构的数据来源进行解析.结构化,将所需的数据从中提取出来:而爬虫的主要目标更多的是页面里的链接和页面的TITLE. 采集器也写过不少了,随便写一点经 ...

  6. .net 生成 静态页面

    .net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...

  7. 用 Smarty 生成静态页面入门介绍

    why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...

  8. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

  9. ASP.Net MVC如何访问的静态页面

    MVC开发中,因为View文件夹下的web.config文件默认会把任何方法的请求的任何文件,路径都交给 System.Web.HttpNotFoundHandler 去处理.起到Controller ...

随机推荐

  1. 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

    最近在对CDN进行优化,对浏览器缓存深入研究了一下,记录一下,方便后来者 画了一个草图: 每个状态的详细说明如下: 1.Last-Modified 在浏览器第一次请求某一个URL时,服务器端的返回状态 ...

  2. Java 标识符、数据类型、运算符

    一.标识符 1.组成 首字母(字母,下划线,﹩)+其余部分(数字,字母,下划线,﹩) 2.命名规范 ①由大小写字母.下划线.数字.﹩ ②数字不能开头 ③标识符长度没有限制 ④标识符不能是关键字和保留字 ...

  3. phpstudy 出现“请自行检查是否安装VC9运行库??”问题 -- 缺少vc9库

    phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...

  4. io流(详询请加qq:2085920154)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ioTest ...

  5. Winform打砖块游戏制作step by step第6节---双缓冲应用

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 二 本节内容---双缓冲应用 1.  主界面截图如下: 2.  什么是双 ...

  6. WinForm开发之取送货管理1

    一.取送货管理项目需求 该系统的业务背景如下:客户是一个针织半成品生产加工作坊,有很多生产加工人员从客户工厂那里取走半成品,加工成成品后送回来.客户根据加工每种半成品的加工单价和完成数量,付费用给生产 ...

  7. dictionaryWithContentsOfFile:方法

    dictionaryWithContentsOfFile:方法的功能是创建一个字典,将字典中的内容设置为指定文件中的所有内容, 语法:(id)dictionaryWithContentsOffilE. ...

  8. cocoapods specs 镜像

    在使用cocoapods 进行update 或者 install的时候 每次回去更新获取的pod specs,每次速度都不是很理想,博主最近对github上的specs仓库进行了镜像,分别在gitca ...

  9. Forwards on Weibo (30)

    BFS,题意比较难懂,是求离query L层的总共人数 #include <stdio.h> #include <string.h> #include <iostream ...

  10. (重要)使用廉价的VPN隐私会被窥探

    使用廉价的VPN可以节省一部分的支出,但是损失的却是我们的网上隐私,很多部门都很关心我们在网上干些什么,本来使用VPN是为了保护自己的隐私不被窥探,很显然这是事与愿违的,一些小公司或者大公司,通过提供 ...