《一步步搭建本身的博客》 源碼地址 :http://www.cnblogs.com/zhaopei/p/4737958.html 若是你也在學習,請私密或者留言,歡迎一切學習總結,分享!html
AdminHelperController index view中的 :git
$.post("http://" + location.host + "/" + $("#iszf").attr("checked") + "/AdminHelper/butOk/" + $("#user").val(),github
標識 post的地址 : Request URL:http://localhost:49532/checked/AdminHelper/butOk/zhaopei //這裏的checked參數 ?ajax
注意 :sql
location.host 包含端口,好比是 127.0.0.1:81。若是端口是 80,那麼就沒有端口,就是 127.0.0.1。數據庫
location.hostname 不包含端口,好比是 127.0.0.1。緩存
根據上面的代碼 : 發現 post執行的 Controller 與 Action 分別是 : AdminHelper/butOk 對應的 路由應該是 :session
//第四種狀況:以 域名 + 用戶名 routes.MapRoute( name: "UserIndex", url: "{name}/{controller}/{action}/{id}", defaults: new { action = "UserBlogList", controller = "UserBlog", id = UrlParameter.Optional } );
然而 butOk 內部調用的是 :Import方法 ,這個方法比較複雜待我好好研讀! mvc
進入 Import 方法後發現 博主拼接了 url 這裏以我本身的博客爲例 :http://www.cnblogs.com/izhiniao/mvc/blog/sidecolumn.aspx 感興趣的能夠單機進去看看 ,能夠幫助理解! 然而Import中結尾包含 下面這段代碼 ,我想應該是把數據 存如數據庫ide
var modelMyBlogs = new ModelDB.Blogs() { BlogContent = blogcontext, BlogCreateTime = blogtime, BlogTitle = blogtitle, BlogUrl = blogurl, IsDel = false, BlogTags = myBlogTags, BlogTypes = myBlogTypes, UsersId = GetUserId(userName), BlogForUrl = blogurl, IsForwarding = iszf == "checked" }; blog.Add(modelMyBlogs); blog.save();
那麼 下面 的這段代碼 背後隱藏寫什麼呢 ? 我先來個猜測 , 後續聯繫博主待證明......?
blog.Add(modelMyBlogs);
猜測 :F12 過去
這裏我標出的「須要注意」 主要是Model1Container 是數據庫的網關類 ,crud都是統一入口, 繼承自 DbContext 這裏有篇博客介紹了 ObjectContext
DbContext 和ObjectContext二者的區別 : ObjectContext是一種模型優先的開發模式,DbContext是代碼優先的開發模式 , 還能夠相互轉換!
最後 save()是這樣構造的 :這裏才進行數據庫操做(順便提提 上面的 add(model)是生存sql語句 )
public int save() { return db.SaveChanges(); }
這個類暫時解說到這裏,對HtmlAgilityPack的理解 自行找資料(不事後期我會開博客寫寫HtmlAgilityPack) , 其實國人開發的 Jumony 更好用
2015-09-06 今天看看數據庫 , 把數據庫關係給大概理清晰
有三個暫時未知幹嗎,別的根據數據很快就能看出來,這裏我直接上圖
既然前面咱們把數據給寫入到數據庫了,那麼接下來我就去看看 博主是怎麼把數據給顯示出來的 ...
那麼咱們首先來從 Blogs.Web 開始 往數據方向一步一步去推導 ...
HomeController 下的 Index() 就是 博客view對應的action 方法 , 這個方法 裏面第一行代碼是 BLL.BlogsBLL blog = new BLL.BlogsBLL(); 建立了一個邏輯Blogs類,
具體怎麼處理 , 背後隱藏了些什麼 (這是三層中的邏輯層,待我稍後細細分析) , 我先看看 下面的代碼 :
var bloglist = blog.GetList(t => t.Id < 50)//我本人對Lamda表達式不熟練,到時候我單獨寫一篇關於lamda表達式的文章,在對這裏作個解析 .Select(t => new { Id = t.Id, BlogTitle = t.BlogTitle, BlogContent = t.BlogContent, UserName = t.Users.UserName, UserNickname = t.Users.UserNickname, BlogCreateTime = t.BlogCreateTime }) .ToList() .Select(t => new ModelDB.Blogs() { Id = t.Id, BlogTitle = t.BlogTitle, BlogContent = MyHtmlHelper.GetHtmlText(t.BlogContent), BlogCreateTime = t.BlogCreateTime, Users = new ModelDB.BlogUsers() { UserName = t.UserName, UserNickname = t.UserNickname }, }).ToList();
這裏的 bloglist 就是博客文章清單 ,而後把這個清單放入 數據字典中 供view 強類型解析
Dictionary<string, object> dic = new Dictionary<string, object>();
這裏的 CacheData.GetUserInfo() 是得到用戶信息,博主這裏用的緩存(本人水平有限,暫時尚未設計到緩存,之後在細說緩存)
對於view中的代碼我就解析幾個有意思的地方
<a href="~/@(blog.Users.UserName)/@(blog.Id).html">@blog.BlogTitle</a>
這個 條 語句生成的html代碼是 : <a href="/zhaopei/12.html">一步步開發本身的博客 .NET版(三、註冊登陸功能)</a>
因此它對應的 路由大概是 :
//第一種狀況:以 域名 + 用戶名 + id + html 後綴組合(默認控制器) routes.MapRoute( name: "UserPage", url: "{name}/{id}.html/{controller}/{action}", defaults: new { action = "UserBlog", controller = "UserBlog", name = "zhaopei", id = 1 } );
對於獲取全部博客的用戶信息 作的緩存 我這裏分析下 :
/// <summary> /// 獲取全部博客的用戶信息 /// </summary> /// <param name="newCache">是否從新獲取</param> /// <returns></returns> public static List<BlogUsers> GetUserInfo(bool newCache = false) { if (null == HttpRuntime.Cache["UserInfo"] || newCache) { BLL.BlogUsersBLL user = new BlogUsersBLL(); HttpRuntime.Cache["UserInfo"] = user.GetList(t => true).ToList(); } return (List<BlogUsers>)HttpRuntime.Cache["UserInfo"]; }
根據代碼能夠看出 首先判斷緩存是否存在和是否重新得到緩存 , 若是不爲空 咱們就返回緩存-----那麼問題又來了,咱們第一次的緩存從那裏得到呢 ?
這裏只能待 博主來回答了 ,我暫時不得而知 。。。。(這個問題待我今天重新看 , 秒懂 ,昨天這麼就沒看出來呢 )
當 null == HttpRuntime.Cache["UserInfo"] 時 就獲取啊 (這不就是第一次獲取嗎 , 本身SB ^_^ ) HttpRuntime.Cache["UserInfo"] = user.GetList(t => true).ToList();
下面這段代碼主要是 實現內容過長而隱藏 ...
@Html.Raw(blog.BlogContent.Substring(0, con_length))
2.下面就是用戶單擊 博客標題後進入博客內容的實現 UserBlogController /UserBlog:
public ActionResult UserBlog(string name, int id) { BLL.BlogsBLL blog = new BLL.BlogsBLL(); var blogobj = blog.GetList(t => t.Id == id && t.Users.UserName == name).FirstOrDefault(); //這裏看 能不能只查詢一次 var blogNext = blog.GetList(t => t.Id > id && t.Users.UserName == name).OrderBy(t => t.Id).FirstOrDefault(); var blogLast = blog.GetList(t => t.Id < id && t.Users.UserName == name).OrderBy(t => t.Id).FirstOrDefault(); var commentList = blogobj.BlogComment.ToList(); Dictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("blog", blogobj); dic.Add("blogNext", blogNext); dic.Add("blogLast", blogLast); dic.Add("commentList", commentList);//對應的評論 dic.Add("contentBlogType", blogobj.BlogTypes.ToList()); dic.Add("contentBlogTag", blogobj.BlogTags.ToList()); SetDic(dic, name); return View(dic); }
看到這段代碼我就理解了,就不須要進行詳細的講解,若是你不懂,能夠在下面進行留言,寫明狀況我有時間會回覆你!
弄到這裏我原本想看看博主的這個博客系統 的資源是怎麼放置的 , 初版發現 圖片連接都是直接調用 博客園的 連接
對於標籤問題(這裏只截了部分代碼)
<a href="~/@(blogName)/GetTagBlogs/@(item.Id).html" >
發現匹配的 路由是 :
//第二種狀況:以 域名 + 用戶名 + action + id + html 後綴組合 routes.MapRoute( name: "UserTagOrType", url: "{name}/{action}/{id}.html/{controller}", defaults: new { action = "UserBlogList", controller = "UserBlog" } );
今天就解讀到這裏 , 下次解讀異常處理!
如今開始繼續讀代碼 : 這裏先把昨天的遺留的問題給提下 , 已經解決 , 樓下的 遊戲世界 也問了 , 因爲博主時間有限 , 我就本身在認真的找了下 , 秒懂 , 上面的紅體部分給出解析
那麼接下來我就 研讀下異常處理吧 , 由於我沒本身搭建過項目 , 因此不懂, 就從博主的開始 ,至於他的處理方式好很差,我在文章中不作什麼解析(我本身沒這能力去評價,不過你以爲你的方法好,能夠指點下我,小弟在這謝謝您了)
/// 全局未處理異常捕獲 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_Error(object sender, EventArgs e) { #region 異常註釋 Exception ex = Server.GetLastError().GetBaseException(); ErrLog.ErrLogSave(ex); string strErr = ErrLog.GetExceptionInfo(ex); //處理完及時清理異常 Server.ClearError(); #endregion //Application_Error 裏不能訪問和操做 session爲null 20150205 //HttpContext.Current.Session //Context.Session #region 跳轉至出錯頁面 //跳轉至出錯頁面 //Server.Transfer("~/html/500.aspx"); //注意:若是是ajax的請求 是不能 Response.Redirect 重定向的 string sheader = Context.Request.Headers["X-Requested-With"]; bool isAjax = (sheader != null && sheader == "XMLHttpRequest") ? true : false; if (isAjax) { HttpContext.Current.Response.Write( new CustomModel.JSData() { State = CustomModel.EnumState.異常或Session超時, JSurl = "/html/500.html?err=" + Microsoft.JScript.GlobalObject.escape(strErr)//System.Web.HttpUtility.UrlEncode(strErr) }.ToJson()); } else Response.Redirect("~/html/500.html?err=" + Microsoft.JScript.GlobalObject.escape(strErr)); #endregion }
按F12 走了個大致流程我以爲有必要專門寫一篇 關於 異常在這個博客系統中的應用 !
那麼本篇文章到此結束 , 若是你感興趣請繼續閱讀下篇 http://www.cnblogs.com/izhiniao/p/4790149.html
本文以學習、研究和分享爲主,版權歸做者和博客園共有,未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接 http://www.cnblogs.com/izhiniao,不然保留追究法律責任的權利