继上上周和上周两个周末都在学习C#基础,这周终于换种方式过了(哎!尼玛还是对着电脑,不是对着妹子T_T)。自从上次在园子里看到博友分享了前端框架Bootstrap后,就一直想用它来搞个小站点玩玩。这个周末终于实践了一下(我之前把Bootstrap官网的Demo全看了一遍,一点没研究的童鞋可能要看一下,不难的),感觉效果还可以,达到了我想要的简约风格(其实对我这样的前端瞎来说,搞复杂的也搞不来)。好了,废话不讲了,直接上成品图了。感兴趣童鞋也们也可直接看真身:传送门http://heku.hk-001.jd43.com/(自己的域名暂时还没绑上去)
1、有图有真相
这是首页(也不知道首页该怎么搞,最后就搞成这样了)
这是博客页面(数据来自博客园Rss)
这是微博页面(图省事,直接放了一个新浪开放平台组件)
还有两个:实验室(实验室我是打算留做一些示例的)和关于就不贴了。
2、源码简单介绍
从上图中,细心的朋友也能看出来,我其实这里只是一些展示,没有做数据存储,所以源码其实很简单,不介绍大家都看得懂。不过还是跑马灯的快速过一遍吧,由于本人在mvc方面研究不深,如果有能优化的地方,还请大家指点。
首先网站结构如下(除了MVC自带的那些,多出的部分已经标出来了):
ErrorFilter文件,用来自定义异常时处理,这里只是增加了异常时发送邮件给我的逻辑。
AppHelper文件,我一般喜欢用一个叫AppHelper的文件来读写配置文件,这样配置里相关节点改名称的话,项目里也只是这个类中要改一下,其他引用处都不用改。
MailHelper文件,简单封装了微软的WebMail类,大家运行前记得配置一下这里的邮箱信息,为什么不放在Web.Config里呢,因为有密码啊,上传到那种便宜主机里太。。。
XMLHelper文件,解析博客园Rss的,Models文件夹下的BlogModel是我对照着博客园Rss写的实体类。
3、几个小问题
1、在实现过程中,遇到一个问题,就是菜单的选中状态处理(首页时“首页”菜单选中,博客页“博客”菜单选中)。
菜单我是放在一个分部视图(_Navbar.cshtml)里的,在不同的页面选中不同的菜单,我是通过在每个菜单生成时都判断Action名称来做的:
@helper CheckRoute(string action) { bool result = string.Equals(action, Request.RequestContext.RouteData.Values["action"].ToString(), StringComparison.OrdinalIgnoreCase); if (result) {<text>class="active"</text>} } <div class="navbar navbar-inverse navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="@Url.Action("Index", "Home")" tabindex="-1">HEKU</a> <ul class="nav"> <li @CheckRoute("Index")><a href="@Url.Action("Index", "Home")" tabindex="1">首页</a></li> <li @CheckRoute("Blog")><a href="@Url.Action("Blog", "Home")" tabindex="2">博客</a></li> <li @CheckRoute("Weibo")><a href="@Url.Action("Weibo", "Home")" tabindex="3">微博</a></li> <li @CheckRoute("Lab")><a href="@Url.Action("Lab", "Home")" tabindex="3">实验室</a></li>@*laboratory*@ <li @CheckRoute("About")><a href="@Url.Action("About", "Home")" tabindex="5">关于</a></li> </ul> </div> </div> </div>
不知道有没有更好的办法?大家平时都是怎么做的啊?
2、在自定义日志拦截器的过程中,也遇到了一个问题,最终未解决,还请大家支招!
下面是这个类的代码(就是增加了异常时发送邮件的逻辑):
public sealed class ErrorFilter : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //异常信息 StringBuilder content = new StringBuilder("================Exception================"); content.Append("<hr/>"); content.AppendFormat("ExceptionTime:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); content.Append("<hr/>"); content.AppendFormat("Message:{0}", filterContext.Exception.Message); content.Append("<hr/>"); content.AppendFormat("Source:{0}", filterContext.Exception.Source); content.Append("<hr/>"); content.AppendFormat("StackTrace:{0}", filterContext.Exception.StackTrace); content.Append("<hr/>"); content.AppendFormat("AccessIp:{0}", filterContext.HttpContext.Request.UserHostAddress); //发送邮件 SendMailAsync(content.ToString()); //ThreadPool.QueueUserWorkItem(new WaitCallback(SendMailAsync), content.ToString()); //异步处理报错,何解? } private void SendMailAsync(object body) { try { MailHelper.SendMail(AppHelper.MailTo, "网站异常", body as string); } catch { } } }
问题就是图中注释掉的部分,原本是想让这个邮件发送是异步来执行。结果不行,报错!知道为什么的请告诉我一下。(错误重现的方式:先把MailHelper里配置好,再把Web.Config里邮件接收人配置一下,把上面代码处同步改成异步,然后在Action里随便抛一个异常。)
4、拿到源码怎么“去何苦化”
如果你感觉页面效果还行,想在此基础上改改,那么:
首先,你要把Web.Config里的这三处改成自己的。(Rss名称空间不用改,大家都一样的应该),改完之后博客页应该就是你的博文了。
<!--博客园博客Rss--> <add key="Rss" value="http://feed.cnblogs.com/blog/u/93918/rss"/> <!--博客Rss的名称空间--> <add key="XMLNS" value="http://www.w3.org/2005/Atom"/> <!--系统异常时,接收异常信息的邮箱--> <add key="MailTo" value=""/>
然后就是把MailHelper类配置一下:
static MailHelper() { //============================请自行配置此处啊啊啊========================= WebMail.SmtpServer = ""; WebMail.SmtpPort = 0; WebMail.UserName = ""; WebMail.Password = ""; WebMail.From = ""; WebMail.SmtpUseDefaultCredentials = true; }
再去新浪微博(或其他微博)开放平台找一下微博秀组件(新浪的http://app.weibo.com/tool/weiboshow),生成一下脚本代码,然后替换掉Weibo.cshtml里的相关代码,此时微博页面也是你的了。(顺便提醒一下,微博的这个组件本地调试时可能显示不出来,不知道为什么,网上找答案时也看到有人遇到过。)
剩下还有首页与关于两个页面,大家直接改Index.cshtml和About.cshtml吧。
5、源码
源码下载(内有惊喜,请自行发现~),如果哪位童鞋在此基础上做出改进了(无论功能或效果),也请到时带我分享一下啊~~~