本贴收集了几个开发中遇到的小问题。

1:利用正则表达式关闭未关闭的 <img>标签。

对于一般的浏览器来说,img 标签是否关闭,即 <img src="pic.jpg"> 还是 <img src="pic.jpg" /> 都可以。但是最近在写markdown 转 epub 格式的转换器,发现如果不关闭 <img 标签,有的 epub 阅读器就会报错。

用正则表达式解决这个问题很简单:

html = Regex.Replace(html, @"(<img(""[^""]*""|[^>])+)(?<!/)>", @"$1 />");

实际使用了上面这个正则表达式以后,发现有些问题,换成了另一个简单一些的:

html = Regex.Replace(html, @"(<img[^>]+)(?<!/)>");

请参考:http://stackoverflow.com/questions/2433809/close-all-html-unclosed-img-tags

2: ASP.NET 中全局设定日期时间格式

在显示 DateTime 类型的值的时候,都会调用 ToString() 方法,在中文环境,默认的日期显示格式是 2013/03/24 11:20:45 这样。

如果我们希望修改显示格式,可以在显示时候调用ToString() 时加上一个格式化的参数,例如:

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

这样就会把斜线分隔符变成横线了。但是每次都要这样写就比较麻烦了。而且在页面显示的时候,经常会遇到 DateTime? 类型的情况,例如在Razor页面,假设要显示一个变量 CreateTime,它是 DateTiem? 类型的。 本来很简单,只要几个字母就可以了:

@CreateTime

这样的结果是,如果是 CreateTime 等于 null 则不显示,如果不是 null 时则显示时间,但是如果为了修改显示时间的格式,就要手工调用带有格式字符串参数的 ToString() 方法,而且麻烦的是此时还必须判断一下是不是空,否则如果 CreateTime == null ,就要抛出 NullReference 异常了。

因此这句话就变成了:

@(CreateTime == null ?  CreateTime.Value.ToString("yyyy-MM-dd HH:mm:ss")  :  "")

一下子复杂了很多,因此可以做一个全局的设置:

protected void Application_BeginRequest()
{
    CultureInfo newCulture =  
         (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
    //newCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
    //newCulture.DateTimeFormat.LongTimePattern = "HH:mm:ss";
    newCulture.DateTimeFormat.DateSeparator = "-";
    Thread.CurrentThread.CurrentCulture = newCulture;
}
  • 如果只改分隔符,只修改 newCulture.DateTimeFormat.DateSeparator 即可。
  • 如果要作其他修改,分别设置短日期和长时间的格式即可,如上面代码中注释掉的两行所示。

3. 在Visual Studio中创建清晰的项目结构

  • 打开 Visual Studio 。
  • FILE -> New Project 。
  • 在对话框左侧栏选择
    Installed -> Templates -> Other Project Types -> Visual Studio Solutions -> Blank Solution 。
  • 填写 Solution 的名字,例如 MyApp 。
  • 填写 Solution 的位置,例如 D:\, 而不要写 D:\MyApp 。
  • 确定,这样就创建了一个空的 Solution 。
  • 在右侧 Solution Explore 窗格中选中建立的Solution名称,鼠标右键,选择 Add -> New Project... 。
  • 在对话框中选择项目类型,例如 C# -> Web -> ASP.NET MVC4 。
  • 填写项目名称,例如 MyApp.Web 。
  • 填写项目位置,例如 D:\MyApp,而不要写 D:\MyApp\MyApp.Web 。
  • 可以继续增加各种 Project 到 Solution 中。这样就可以建立起一个结构很清晰的 Solution 了。