精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談ASP.NET MVC中的FluentHtml與連續(xù)接口

開發(fā) 后端
本文將簡單談?wù)凙SP.NET MVC中的FluentHtml與連續(xù)接口,其目的是為了能夠在View中能夠簡潔清晰的構(gòu)造HTML元素。

我們力求頁面層代碼簡潔并具有較好的可讀性,在ASP.NET MVC的平臺上,我們以新的起點來實現(xiàn)這一目標(biāo).MvcContrib.FluentHtml和Spark ViewEngine給我們做出了榜樣.本文將以MvcContrib.FluentHtml為例探究它的實現(xiàn)機(jī)制:Fluent Interface.

在MvcContrib.FluentHtml的應(yīng)用中,我們隨處可以見到下面的代碼:

  1. < %= this.TextBox(x => x.Person.Name).Title("Enter the person's name").Label("Name:") %> 
  2. ……   
  3.  < %= this.Select(x => x.Person.Gender).Options(Model.Genders).Size(5).Label("Gender:")  
  4. .Title("Select the person's gender") %> 

 瀏覽器中生成的代碼為:

  1. < LABEL id=Person_Name_Label for=Person_Name>Name:< /LABEL> 
  2. < INPUT id=Person_Name title="Enter the person's name" value=Jeremy maxLength=50 name=Person.Name> 
  3.  .  
  4. < SELECT id=Person_Gender title="Select the person's gender" size=5 name=Person.Gender>< OPTION selected value=M>Male< /OPTION>< OPTION value=F>Female< /OPTION>< /SELECT> 

上面對動態(tài)生成TextBox和Select的代碼很有意思,我們使用普通的方式在頁面上生成同樣的客戶端代碼,CS代碼大致是這樣的: 

  1. Label label = new Label();  
  2.  label.Text = "Name";  
  3.  TextBox textboxnew TextBox();  
  4.  textbox.ToolTip ="Enter the person's name";  
  5.  textbox.ID = "No.10001";  
  6.  textbox.ID = "Person.Name"

而FluentHtml創(chuàng)建頁面元素的方式讓我們很容易聯(lián)想到StringBuilder的使用: 

  1. StringBuilder stringbuilder = new StringBuilder();  
  2.  stringbuilder.Append("Hello").Append(" ").Append("World!"); 

Fulent Interface 這種實現(xiàn)編程方式就是"Fluent Interface",這并不是什么新概念,2005年Eric Evans 和Martin Fowler就為這種實現(xiàn)方式命名.源文檔 <http://www.martinfowler.com/bliki/FluentInterface.html> 可以通過維基百科中對Fluent Interface的描述獲得一個基本的了解:In software engineering, a fluent interface (as first coined by Eric Evans and Martin Fowler) is a way of implementing an object oriented API in a way that aims to provide for more readable code.

我們分解上面的話:

它是面向?qū)ο驛PI的一種實現(xiàn)方式,目的是增加代碼的可讀性.。既然我們最熟悉的是StringBuilder,我們就從這個線索追下去:打開Reflector,很容易找到StringBuilder的Append方法:

  1. public StringBuilder Append(string value)  
  2. {  
  3. if (value != null)  
  4. {  
  5.  string stringValue = this.m_StringValue;  
  6.  IntPtr currentThread = Thread.InternalGetCurrentThread();  
  7.  if (this.m_currentThread != currentThread)  
  8.  {  
  9.  stringstringValue = string.GetStringForStringBuilder(stringValue, stringValue.Capacity);  
  10.  }  
  11.  int length = stringValue.Length;  
  12.  int requiredLength = length + value.Length;  
  13.  if (this.NeedsAllocation(stringValue, requiredLength))  
  14.  {  
  15.  string newString = this.GetNewString(stringValue, requiredLength);  
  16.  newString.AppendInPlace(value, length);  
  17.  this.ReplaceString(currentThread, newString);  
  18.  }  
  19.  else  
  20.  {  
  21.  stringValue.AppendInPlace(value, length);  
  22.  this.ReplaceString(currentThread, stringValue);  
  23.  }  
  24. }  
  25. return this;  

閱讀這段有兩個特別要注意的點:1.方法的返回值是StringBuilder類型 2.***一句:return this;為了深刻理解,我們寫一個簡單的StringBuilder:

  1. public interface IContentBuilder  
  2. {  
  3.  void WriteContent();  
  4.  IContentBuilder Append(string partialContent);  
  5. }  
  6. public class TestContentBuilder : IContentBuilder  
  7. {  
  8.  string temp;  
  9.  #region IContentBuilder Members  
  10.  
  11.  void IContentBuilder.WriteContent()  
  12.  {  
  13.  Console.Write(temp);  
  14.  }  
  15.  
  16.  IContentBuilder IContentBuilder.Append(string partialContent)  
  17.  {  
  18.  temp += partialContent;  
  19.  return this;  
  20.  }  
  21.  
  22.  #endregion  
  23. }  
  24. … …  
  25. //調(diào)用代碼  
  26. IContentBuilder t = new TestContentBuilder();  
  27.  t.Append("test").Append("Hello").WriteContent(); 

跑一下代碼,和StringBuilder效果是一樣的.從上面的應(yīng)用也可以看出:Fluent Interface經(jīng)常用來完成對象的構(gòu)造和屬性賦值.

言歸正傳:FluentHTML了解了Fluent Interface,我們來看一下MVCContrib.FluentHTML的實現(xiàn),這里以TextBox為例進(jìn)行考察,首先看一下它的繼承關(guān)系:

  1. public class TextBox : TextInput  
  2. public abstract class TextInput : Input, ISupportsMaxLength where T : TextInput  
  3. public abstract class Input : FormElement where T : Input, Ielement 

泛型是一種高層次的算法抽象,我們就通過Input一窺端倪:

  1. public abstract class Input : FormElement where T : Input, IElement  
  2. {  
  3. protected object elementValue;  
  4. protected Input(string type, string name) : base(HtmlTag.Input, name)  
  5. {  
  6.  builder.MergeAttribute(HtmlAttribute.Type, type, true);  
  7. }  
  8. protected Input(string type, string name, MemberExpression forMember, IEnumerable behaviors)  
  9.  : base(HtmlTag.Input, name, forMember, behaviors)  
  10. {  
  11.  builder.MergeAttribute(HtmlAttribute.Type, type, true);  
  12. }  
  13. ///   
  14. /// Set the 'value' attribute.  
  15. ///   
  16. /// The value for the attribute.  
  17. public virtual T Value(object value)  
  18. {  
  19.  elementValue = value;  
  20.  return (T)this;  
  21. }  
  22. ///   
  23. /// Set the 'size' attribute.  
  24. ///   
  25. /// The value for the attribute.  
  26. public virtual T Size(int value)  
  27. {  
  28.  Attr(HtmlAttribute.Size, value);  
  29.  return (T)this;  
  30. }  
  31. protected override void PreRender()  
  32. {  
  33.  Attr(HtmlAttribute.Value, elementValue);  
  34.  base.PreRender();  
  35. }  
  36. }  
  37. 以Size方法為例,可以看出這是一種典型的Fluent Interface實現(xiàn):  
  38. public virtual T Size(int value)  
  39. {  
  40. Attr(HtmlAttribute.Size, value);  
  41. return (T)this;  

分析到這里,上面的語句中還有一點比較奇怪,就是Lambda表達(dá)式的部分:

  1. this.TextBox(x => x.Person.Name).Title("Enter the person's name").Label("Name:") 

TextBox的實現(xiàn)代碼里面我們沒有看到對Lambda表達(dá)式的支持.那是在什么地方完成的呢?通過跟進(jìn),我們來到了ViewDataContainerExtensions,它是IViewDataCon

  1. namespace MvcContrib.FluentHtml  
  2. {  
  3. ///   
  4. /// Extensions to IViewDataContainer  
  5. ///   
  6. public static class ViewDataContainerExtensions  
  7. {  
  8.  ///   
  9.  /// Generate an HTML input element of type 'text' and set its value from ViewData based on the name provided.  
  10.  ///   
  11.  /// The view.  
  12.  /// Value of the 'name' attribute of the element.Also used to derive the 'id' attribute.  
  13.  public static TextBox TextBox(this IViewDataContainer view, string name)  
  14.  {  
  15.  return new TextBox(name).Value(view.ViewData.Eval(name));  
  16.  }  
  17. … …  

tainer 的Extension Method:

看一下return new TextBox(name).Value(view.ViewData.Eval(name));所以這里就成了TextBox定義方法鏈的***步.

FluentHtml與連續(xù)接口總結(jié)

為了能夠在View中能夠簡潔清晰的構(gòu)造HTML元素,Asp.net MVC中通過htmlHelper.InputHelper來實現(xiàn)頁面元素的構(gòu)造. 頁面層所使用的<%= Html.TextBox("username") %>,HTML也是htmlHelper的Extension Method.相比較起來,htmlHelper提供了基礎(chǔ)的頁面控件定義和構(gòu)造,而FluentHTML表現(xiàn)的更為靈活.除了FluentHTML,著名的Spark View Engine也有類似的實現(xiàn),大家可以關(guān)注一下.

【編輯推薦】

  1. VS2010 Beta 1的ASP.NET MVC安裝包發(fā)布
  2. ASP.NET中性能和擴(kuò)展性的秘密
  3. ASP.NET 3.5圖表控件親密接觸
  4. 自己動手實現(xiàn)Asp.net的MVC框架
  5. ASP.NET中防止用戶多次登錄的方法
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-07-20 12:42:04

MvcContrib.ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-12-21 10:05:10

ASP.NET MVC

2011-01-28 09:45:29

ASP.NET MVC

2009-12-07 09:23:05

ASP.NET MVC

2009-07-27 13:01:28

TreeViewASP.NET

2009-06-09 11:37:51

ViewStateViewDataASP.NET

2009-07-29 09:38:06

Web開發(fā)ASP.NET

2009-07-07 10:14:57

基于URL權(quán)限控制

2011-06-08 11:36:16

ASP.NETrender

2009-07-22 13:16:04

MvcAjaxPaneASP.NET MVC

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET應(yīng)用

2009-07-24 10:52:42

ASP.NET ISA

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-23 11:11:41

2009-12-08 08:57:21

ASP.NET MVC

2009-01-16 13:17:16

AjaxASP.NET.NET
點贊
收藏

51CTO技術(shù)棧公眾號

成人免费在线观看av| 不卡福利视频| www.欧美色图| 国产成人精品综合久久久| 日韩精品电影一区二区三区| 国产精品亚洲四区在线观看| 亚洲第一搞黄网站| 污视频在线免费观看一区二区三区| 国产又粗又猛又黄又爽| 伊人成年综合电影网| 亚洲欧美日韩天堂一区二区| 一区二区三区四区毛片| 国产黄大片在线观看| 国产精品免费视频一区| 国内精品久久久久久久果冻传媒| 中文字幕你懂的| 亚洲国产网站| 日韩亚洲欧美中文在线| 99re久久精品国产| 亚洲爽爆av| 色婷婷久久久综合中文字幕| 老司机午夜网站| 国产视频网站在线| 成av人片一区二区| 51成人做爰www免费看网站| 综合网在线观看| 欧美激情日韩| 最近2019中文字幕在线高清| 国产精品成人无码专区| 99tv成人影院| 色域天天综合网| 欧美图片激情小说| a级影片在线观看| 欧美国产精品v| 精品无码久久久久国产| 精品人妻一区二区三区换脸明星| 日韩va亚洲va欧美va久久| 97在线精品视频| 久操视频免费在线观看| 天天综合网91| 最新国产精品拍自在线播放| 欧美成人午夜精品免费| 老司机在线精品视频| 日韩精品一区二区三区老鸭窝 | 国产农村妇女精品一二区| 欧美另类xxx| 日韩影院一区二区| 999国产精品永久免费视频app| 国产亚洲精品综合一区91| 国产精品无码一区二区三| 一区二区三区四区精品视频 | 久久婷婷综合色| 日韩三级影视| 色婷婷亚洲综合| 日本熟妇人妻xxxxx| 成人短视频app| 一本在线高清不卡dvd| 欧美视频在线播放一区| 欧美日韩国产观看视频| 精品久久久久久亚洲精品| 欧美成人精品免费| 青青草视频在线免费直播| 亚洲麻豆国产自偷在线| 热久久最新网址| 成人国产免费电影| 亚洲午夜精品在线| 九一国产精品视频| 涩涩在线视频| 色偷偷一区二区三区| 男人舔女人下面高潮视频| 欧美中文字幕精在线不卡| 在线视频中文字幕一区二区| 天天综合网日韩| 欧美美女被草| 欧美一区二区观看视频| 特级特黄刘亦菲aaa级| 欧美jizz19性欧美| 一区三区二区视频| 999精品在线视频| 国产精品a久久久久| 97久久久久久| 自拍偷拍校园春色| 精品亚洲免费视频| 国产精品久久久久免费| 亚洲欧美综合一区二区| 欧美国产日本韩| 欧美一级特黄aaaaaa在线看片| 狂野欧美性猛交xxxxx视频| 欧美日韩国产专区| 成人精品小视频| 国产一区二区三区免费观看在线 | 国产国语刺激对白av不卡| 亚洲视频在线观看免费视频| 国产成人在线色| 欧美大陆一区二区| 蜜芽在线免费观看| 亚洲成av人片一区二区梦乃| 亚洲色图38p| 日韩免费高清视频网站| 精品亚洲一区二区三区在线观看 | 亚洲精品911| 久久五月婷婷丁香社区| 亚洲美女自拍偷拍| 夜鲁夜鲁夜鲁视频在线播放| 欧美剧情电影在线观看完整版免费励志电影| 午夜大片在线观看| 欧美猛男男男激情videos| 久久国产精品99国产精| 日本视频网站在线观看| 国产精品自产自拍| 日产国产精品精品a∨| 色在线视频网| 欧美色倩网站大全免费| 亚洲观看黄色网| 午夜电影亚洲| 国产精品亚洲第一区| 天天综合天天综合| 亚洲日本丝袜连裤袜办公室| 丁香啪啪综合成人亚洲| 中文字幕一区二区三区中文字幕| 亚洲一区二区福利| 国产成年人免费视频| 韩国欧美国产一区| 亚洲成人18| 在线男人天堂| 亚洲国产黄色片| 欧美精品videos极品| 久久精品国产99国产精品| 久久大片网站| 2021中文字幕在线| 日韩欧美视频在线| 欧美精品久久久久久久久46p| 日本aⅴ免费视频一区二区三区| 国产日韩欧美一区二区| 色婷婷av在线| 欧美一区二区不卡视频| 91传媒免费观看| 麻豆精品久久久| 日韩av电影免费在线观看| 忘忧草在线影院两性视频| 欧美va日韩va| 免费一级黄色大片| 国产在线麻豆精品观看| 亚洲欧美日韩不卡| 国产精品欧美一区二区三区不卡| www.亚洲成人| 91成品人影院| 最新久久zyz资源站| 99re6在线观看| 88国产精品视频一区二区三区| 国产精品视频一| 在线观看免费版| 欧美日韩电影一区| 美国一级片在线观看| 久久精品国产久精国产爱| 亚洲欧美成人一区| 亚洲精品69| 九九九久久久久久| www.激情五月.com| 亚洲动漫第一页| 波多野结衣影院| 国产精品日韩欧美一区| 蜜桃传媒一区二区| 成人黄页网站视频| 久久精品视频在线观看| 国产黄色大片网站| 亚洲3atv精品一区二区三区| 日本少妇毛茸茸| 久久中文在线| 亚洲一区二区三区在线观看视频| 成人激情久久| 久久久久在线观看| 日漫免费在线观看网站| 在线中文字幕一区| √天堂中文官网8在线| 成人性生交大片| 青青在线视频观看| 久久国产亚洲| 俄罗斯精品一区二区| 美女视频在线免费| 尤物tv国产一区| av中文字幕免费在线观看| 亚洲午夜影视影院在线观看| 六十路息与子猛烈交尾| 蜜桃久久精品一区二区| 黄网站色视频免费观看| 日韩精品导航| 国产精品视频一区二区高潮| a视频在线播放| 精品性高朝久久久久久久| 91在线精品入口| 天天色图综合网| 国产三级aaa| www.欧美日韩国产在线| 爱爱爱爱免费视频| 18成人免费观看视频| 神马影院一区二区三区| 中文字幕日韩在线| 国产精品丝袜白浆摸在线 | 九九精品久久| 91视频婷婷| 偷拍视频一区二区三区| 久久777国产线看观看精品| 户外极限露出调教在线视频| 日韩欧美中文字幕一区| 日本熟妇一区二区三区| 亚洲一区自拍偷拍| 欧日韩不卡视频| 本田岬高潮一区二区三区| 男操女免费网站| 亚洲美女黄色| 综合操久久久| 狠狠做六月爱婷婷综合aⅴ| 91亚色免费| 高清在线一区| 日韩美女av在线免费观看| 视频在线这里都是精品| 久久精品国产成人精品| 久久视频www| 亚洲精品久久久久久久久久久| 国产精品无码久久久久成人app| 欧美日韩在线视频观看| 激情四射综合网| 18欧美乱大交hd1984| 91视频在线网站| 99精品在线免费| 亚洲av综合色区无码另类小说| 免费观看在线色综合| 黄色片一级视频| 99热免费精品在线观看| 国产玉足脚交久久欧美| 亚洲精品一区二区妖精| 午夜精品区一区二区三| 国产成人调教视频在线观看| 精品一区二区不卡| 国产精品久久久网站| 91在线国产电影| 国产欧美日韩电影| 国产日韩av在线播放| 99久久亚洲国产日韩美女| 国产a∨精品一区二区三区不卡| 天堂av在线网| 欧洲中文字幕国产精品| 蜜桃视频www网站在线观看| 午夜精品蜜臀一区二区三区免费| 性欧美video高清bbw| 欧美日本精品在线| 亚洲资源一区| 欧美国产第一页| 男女在线观看视频| 久久久久久久久久久网站| 国产丝袜视频在线播放| 久久久免费电影| 国产福利电影在线播放| 欧美孕妇毛茸茸xxxx| 国产日韩电影| 国产精品91免费在线| 香蕉成人影院| 国产精品亚洲美女av网站| 91成人app| 1区1区3区4区产品乱码芒果精品| 亚洲精品午夜| 久久香蕉综合色| 国产一区二区精品福利地址| 杨幂一区欧美专区| 午夜亚洲福利| 免费成人在线视频网站| 日韩国产欧美在线视频| 亚洲图色中文字幕| 懂色中文一区二区在线播放| 日本黄色免费观看| 亚洲国产高清在线观看视频| 日韩高清dvd碟片| 午夜亚洲国产au精品一区二区| 毛片毛片女人毛片毛片| 在线影视一区二区三区| 国产欧美日韩综合精品一区二区三区| 日韩欧美一区二区不卡| 天天摸天天碰天天爽天天弄| 亚洲性夜色噜噜噜7777| 呦呦在线视频| 欧美亚洲在线播放| 日韩电影精品| 国产中文一区二区| 欧美日韩国产免费观看视频| 在线观看视频黄色| 99热这里只有精品8| 五月天中文字幕在线| 成人avav影音| 欧美爱爱免费视频| 五月天国产精品| 一级成人免费视频| 亚洲国产精品yw在线观看| 天堂аⅴ在线地址8| 97在线观看视频| 精品一区二区三区中文字幕| 久久福利电影| 中文在线播放一区二区| 青青在线视频观看| 粉嫩蜜臀av国产精品网站| 四季av中文字幕| 精品露脸国产偷人在视频| 国产又粗又大又黄| 亚洲欧美一区二区三区在线| 天天色天天射天天综合网| 国产91精品最新在线播放| 51精品国产| 中文字幕不卡每日更新1区2区| 国产精品视频| 久久久无码人妻精品无码| 国产精品亲子乱子伦xxxx裸| 日韩在线视频免费播放| 日韩情涩欧美日韩视频| www免费网站在线观看| 91精品国产91久久久久久不卡| 精品精品视频| 亚洲欧洲日夜超级视频| 欧美亚洲三区| 北京富婆泄欲对白| 亚洲精品日日夜夜| 在线免费av片| 亚洲欧洲国产伦综合| 大桥未久在线播放| 亚洲va男人天堂| 久久国产综合| 91网址在线播放| 久久午夜国产精品| 国产成人精品网| 亚洲国产天堂久久国产91| 在线免费观看污| 成人欧美一区二区三区在线| 欧美精选一区二区三区| 黄色国产精品视频| 99久久国产综合色|国产精品| 久草视频手机在线观看| 欧美一区二区三区在线| 免费黄色在线| 国产拍精品一二三| 日韩免费在线| 亚洲最大成人在线观看| 中文字幕国产一区| 中文字幕av资源| 搡老女人一区二区三区视频tv| 日本.亚洲电影| 午夜精品一区二区三区四区| 日韩精品免费视频人成| 欧美做受高潮6| 欧美在线看片a免费观看| 国产在线观看精品一区| 国产精品扒开腿做爽爽爽视频| 蜜桃一区二区| 国产三级三级三级看三级| 国产视频亚洲色图| 最近中文字幕免费观看| 神马久久久久久| 国产精品亚洲欧美一级在线| 久久久国内精品| av不卡在线播放| 亚洲黄色激情视频| 亚洲日本欧美中文幕| 91av一区| 五月天av影院| 成人夜色视频网站在线观看| 日韩一区二区视频在线| 国产一区二区三区日韩欧美| 美女久久久久久| 9色视频在线观看| 成人国产在线观看| 欧美 日韩 精品| 中文综合在线观看| 清纯唯美激情亚洲| www黄色日本| 国产精品网曝门| av中文字幕免费在线观看| 国内精久久久久久久久久人| 亚洲v天堂v手机在线| 美女网站视频黄色| 一区二区三区中文字幕电影| 天天操天天干天天干| 国产精品久久久久77777| 一本一本久久a久久综合精品| 国产综合内射日韩久| 日本精品一区二区三区高清| 国产最新在线| 久久99精品久久久久久三级| 日本欧美加勒比视频| 加勒比婷婷色综合久久| 日韩精品免费一线在线观看| 日韩福利在线观看| 亚洲国产成人精品无码区99| 国产欧美一区二区三区沐欲 | 亚洲精品国产福利| 玖玖精品在线| 欧美大片在线播放| 国产精品家庭影院| 日韩在线免费播放| 51国偷自产一区二区三区| 日韩电影在线一区| 久久精品免费在线| 色偷偷av亚洲男人的天堂|