91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ASP.NET MVC 2框架試用經(jīng)驗談

本文將為大家介紹已經(jīng)發(fā)布的ASP.NET MVC 2框架正式版的使用情況,包括緩存,靜態(tài)內(nèi)容的放置等等。希望本文能對大家有所幫助。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供做網(wǎng)站、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

這個月一直在用 ASP.NET MVC 2 做http://www.86e0.com/t 這個網(wǎng)站,用的時候是 aps.net MVC2 RC2,然后現(xiàn)在ASP.NET MVC 2正式版已經(jīng)是發(fā)布了。 在MVC的使用上,有一些心得。下面作一下總結(jié),希望對大家有用,也歡迎大家討論。

1.關(guān)于緩存

緩存上,數(shù)據(jù)層上的緩存是必須的,這點不必多說了。

另一個很重要的是:視圖片段緩存。

我參考了老趙的寫的三篇關(guān)于片段緩存的文章:

適合ASP.NET MVC的視圖片斷緩存方式(上):起步

適合ASP.NET MVC的視圖片斷緩存方式(中):更實用的API

適合ASP.NET MVC的視圖片斷緩存方式(下):頁面輸出原則

本想用老趙的了,但是我發(fā)現(xiàn)ASP.NET MVC 2 的有一個新功能: Html.Partial可以返回生成的HTML, 返回的類型是:MvcHtmlString. 雖然要利用Partial View才能生成Html片段,但是我想這個已經(jīng)夠我用的了, 所以我做了一個這樣一個Helper,主要是將生成的HTML片段緩存到Memcached里。代碼如下:

 
 
 
 
  1. public static class MvcHtmlHelper   
  2. {   
  3. public static MvcHtmlString MemcacheHtmlPartial(this HtmlHelper htmlHelper,int duration, string partialViewName, object model, ViewDataDictionary viewData)   
  4. {   
  5. object obaear = htmlHelper.ViewContext.RouteData.DataTokens["area"];   
  6. string area=string.Empty;   
  7. if (obaear != null) area = obaear.ToString();   
  8. string key = string.Format("MemcacheHtmlPartial_{0}{1}", area, partialViewName);   
  9. object ob = DistCache.Get(key);   
  10. if (ob == null)   
  11. {   
  12.  MvcHtmlString mstr = htmlHelper.Partial(partialViewName, model, viewData);   
  13.  DistCache.Add(key, mstr.ToString(), TimeSpan.FromSeconds(duration));   
  14. return mstr;   
  15. }   
  16. else 
  17. {   
  18.  return MvcHtmlString.Create((string)ob);   
  19. }   
  20.  }   

然后,我覺得,這樣,在每次請求時,還是要在Controller 里把數(shù)據(jù)取出來,然后再傳到 Partial View里。 既然已經(jīng)緩存了,就應(yīng)該不用每次請求都要在Controller里把數(shù)據(jù)取出來才對!雖然數(shù)據(jù)層會有緩存。

所以我,能不能再省下去Controller取數(shù)據(jù)的消耗,于是又有了以下代碼,其功能是:緩存Action生成的HTML到Memcached里。

 
 
 
 
  1. public static MvcHtmlString MemcacheHtmlRenderAction(this HtmlHelper htmlHelper, 
  2. int duration, string actionName,string controllerName, RouteValueDictionary routeValues)   
  3. {   
  4. object obaear = htmlHelper.ViewContext.RouteData.DataTokens["area"];   
  5. string area = string.Empty;   
  6. if (obaear != null) area = obaear.ToString();   
  7. string key = string.Format("MemcacheHtmlRenderAction_{0}{1}{2}", area, controllerName,actionName);   
  8. object ob = DistCache.Get(key);   
  9.  if (ob == null)   
  10.  {   
  11.  // htmlHelper.RenderAction(actionName, controllerName, routeValues);   
  12. StringWriter writer = new StringWriter(CultureInfo.CurrentCulture);   
  13.  ActionHelper(htmlHelper, actionName, controllerName, routeValues, writer);   
  14. string wStr = writer.ToString();   
  15. DistCache.Add(key, wStr,TimeSpan.FromSeconds(duration));   
  16. MvcHtmlString mstr = MvcHtmlString.Create(wStr);   
  17. return mstr;   
  18.  }   
  19. else { return MvcHtmlString.Create((string)ob); }   

說明一下,Actionhelper的方法是在MVC原代碼里提取出來的。 因為MVC2里的 Html.RenderAction方法并沒有返回 MvcHtmlString的重載版。那位有更好的方法?

其實,MVC里的Action有輸出緩存,所以直接在View里用 Html.RenderAction都可以解決很多問題了。這個主要是可以用程序管理緩存。

2.關(guān)于靜態(tài)內(nèi)容的放置

習(xí)慣上,靜態(tài)內(nèi)容會放在 mvc程序所在的目錄下,比如說js,css,上傳的圖片等。但是這樣的話,所有的靜態(tài)請求都要經(jīng)過 aspnet_isapi 處理,這樣是非常不合算的。所以靜態(tài)內(nèi)容一般都會放在另外的子域上。http://www.86e0.com/t 是放在 cdn.86e0.com上。

3.關(guān)于強(qiáng)類型ViewModel

我基本上看了老趙的Asp.net MVC***實踐。 其中有一點,就是強(qiáng)烈推薦使用強(qiáng)類型的ViewModel. 我試了一些頁面,發(fā)現(xiàn)用強(qiáng)類型的ViewModel,現(xiàn)階段并不適用于我。因為我是用NbearLite,從數(shù)據(jù)庫抓出來的大多是DataTable. 我是覺得DataTable+NbearLite蠻方便的,雖然沒有動態(tài)語言的數(shù)據(jù)訪問來得方便,但是比用Entity,ViewModel, DTO,等等來說,還是可以省下很多代碼。然后,最重要的是,由于我這種站經(jīng)常會修改,所以數(shù)據(jù)庫改變,加字段,減字段是很經(jīng)常性的事。但是,用NbearLite + DataSet,DataTable,卻非常方便。

所以我覺得,做Asp.net MVC,如果你不是用DDD,DDT的話,用DataTable還是可以的。因為DDD,DDT學(xué)習(xí)起來還是要點成本的。

4.關(guān)于URL生成

URL生成, 老趙寫了一系列文章:

各種URL生成方式的性能對比

各種URL生成方式的性能對比(結(jié)論及分析)

為URL生成設(shè)計流暢接口(Fluent Interface)

URL生成方式性能優(yōu)化結(jié)果

我直接選擇

Raw方式了, 速度最快的,才是適合我的。呵。 而不是強(qiáng)類型的才是適合我的。

***,分享一個很實用的Asp.net MVC 分頁Helper.

這個Helper引自重典老大的blog:http://www.cnblogs.com/chsword/ . 我在之前做了少少修改,現(xiàn)已經(jīng)在http://www.86e0.com/t 上使用了。

效果如下:

請大家注意生成的 URL, 是用 ?參數(shù)=頁碼 的方式。代碼如下:

 
 
 
 
  1. ///    
  2. /// 分頁Pager顯示   
  3. ///    
  4. ///    
  5. /// 標(biāo)識當(dāng)前頁碼的QueryStringKey   
  6. /// 每頁顯示   
  7. /// 總數(shù)據(jù)量   
  8. ///    
  9. public static string Pager(this HtmlHelper html, string currentPageStr, int pageSize, int totalCount)   
  10.  {   
  11. var queryString = html.ViewContext.HttpContext.Request.QueryString;   
  12. int currentPage = 1; //當(dāng)前頁   
  13. if(!int.TryParse(queryString[currentPageStr], out currentPage)) currentPage = 1; //與相應(yīng)的QueryString綁定   
  14.  var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); //總頁數(shù)   
  15. var dict = new RouteValueDictionary(html.ViewContext.RouteData.Values);   
  16. var output = new StringBuilder();   
  17. foreach (string key in queryString.Keys)   
  18. if (queryString[key] != null && !string.IsNullOrEmpty(key))   
  19. dict[key] = queryString[key];   
  20. if (totalPages > 1)   
  21. {   
  22. if (currentPage != 1)   
  23. {//處理首頁連接   
  24. dict[currentPageStr] = 1;   
  25. output.AppendFormat("{0}", html.RouteLink("首頁", dict));   
  26.  }   
  27.  if (currentPage > 1)   
  28. {//處理上一頁的連接   
  29. dict[currentPageStr] = currentPage - 1;   
  30. output.AppendFormat("{0}", html.RouteLink("上一頁", dict));   
  31. }   
  32.  else 
  33. {   
  34.  output.AppendFormat("{0}","上一頁");   
  35.   }   
  36. int currint = 5;   
  37.  for (int i = 0; i <= 10; i++)   
  38.  {//一共最多顯示10個頁碼,前面5個,后面5個   
  39. if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages)   
  40.  if (currint == i)   
  41. {//當(dāng)前頁處理   
  42.  output.Append(string.Format("{0}", currentPage));   
  43.  }   
  44.  else 
  45.   {//一般頁處理   
  46. dict[currentPageStr] = currentPage + i - currint;   
  47. output.AppendFormat("{0}",html.RouteLink((currentPage + i - currint).ToString(), dict));   
  48.    }   
  49.    }   
  50.  if (currentPage < totalPages)   
  51.    {//處理下一頁的鏈接   
  52.     dict[currentPageStr] = currentPage + 1;   
  53.      output.AppendFormat("{0}", html.RouteLink("下一頁", dict));   
  54.    }   
  55.     else 
  56.       {   
  57.       output.AppendFormat("{0}", "下一頁");   
  58.    }   
  59.    if (currentPage != totalPages)   
  60.     {   
  61.    dict[currentPageStr] = totalPages;   
  62.      output.AppendFormat("{0}",html.RouteLink("末頁", dict));   
  63.    }   
  64.     }   
  65.   output.AppendFormat("第{0}頁/共{1}頁", currentPage, totalPages);//這個統(tǒng)計加不加都行   
  66.    return output.ToString();   
  67.   }  

ASP.NET MVC延伸閱讀

ASP.NET MVC是微軟官方提供的MVC模式編寫ASP.NET Web應(yīng)用程序的一個框架。

它由Castle的MonoRail而來.目前已經(jīng)歷經(jīng)數(shù)個版本。ASP.NET MVC中的MVC本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。

ASP.NET MVC框架是既ASP.NET WebForms后的又一種開發(fā)方式。它提供了一系列優(yōu)秀特性,使ASP.NET開發(fā)人員擁有了另一個選擇。ASP.NET MVC框架選項非常干凈,而且容易使用。它將允許你在應(yīng)用中輕易地保持關(guān)注分離,且有助于進(jìn)行干凈的測試和TDD。


網(wǎng)站欄目:ASP.NET MVC 2框架試用經(jīng)驗談
本文鏈接:http://m.jiaoqi3.com/article/djoegdc.html