ASP.NET 5 Beta5 對TagHelper帶來的變化

最近作的TagHelper項目要從原來的ASP.NET 5 Beta 4升級到Beta 5,特意整理了升級後的變化:html

  1. 新增ImageTagHelper
    <img asp-file-version="true" src="~/images/my_cool_image.png" /> 
  2. Tag Helper支持綁定字典屬性
    如今你能夠在TagHelpers中綁定服務器端的attributes到字典屬性。好比,AnchorTagHelper利用名字格式爲asp-route-*的attributes來設置路由值。
    <a asp-action="Edit" asp-route-id="@index">Edit</a>
    

    在該類中定義以下:git

    public class AnchorTagHelper : TagHelper
    {
        private const string RouteValuesDictionaryName = "asp-all-route-data";
        private const string RouteValuesPrefix = "asp-route-";
    
    
        /// <summary>
        /// Additional parameters for the route.
        /// </summary>
        [HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix = RouteValuesPrefix)]
        public IDictionary<string, string> RouteValues { get; set; } =
                new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        ...        
    }
    

    這裏只列出與該Dictionary屬性相關的定義,主要是在該屬性頭上添加HtmlAttributeName並設置其DictionaryAttributePrefix。  github

  3. Tag Helper支持基於服務端Attributes設置的條件綁定,並支持通配符*。
    你能夠利用TargetElementAttribute中Attributes屬性來指定當前TagHelper應用到擁有某些attributes的tag上。好比AnchorTagHelper類的定義以下:
    [TargetElement("a", Attributes = ActionAttributeName)]
    [TargetElement("a", Attributes = ControllerAttributeName)]
    [TargetElement("a", Attributes = FragmentAttributeName)]
    [TargetElement("a", Attributes = HostAttributeName)]
    [TargetElement("a", Attributes = ProtocolAttributeName)]
    [TargetElement("a", Attributes = RouteAttributeName)]
    [TargetElement("a", Attributes = RouteValuesDictionaryName)]
    [TargetElement("a", Attributes = RouteValuesPrefix + "*")]
    public class AnchorTagHelper : TagHelper
    {
        private const string ActionAttributeName = "asp-action";
        private const string ControllerAttributeName = "asp-controller";
        private const string FragmentAttributeName = "asp-fragment";
        private const string HostAttributeName = "asp-host";
        private const string ProtocolAttributeName = "asp-protocol";
        private const string RouteAttributeName = "asp-route";
        private const string RouteValuesDictionaryName = "asp-all-route-data";
        private const string RouteValuesPrefix = "asp-route-";
        private const string Href = "href";
     
        ...
    }
    

    從上面能夠看出,該TagHelper會應用到A tag上,而且這個tag上須要有asp-action, asp-controller, asp-fragment, asp-host, asp-protocol, asp-route, asp-all-route-data和asp-route-*這些attributes中一個或一個以上,不然該tag就會綁定到該TagHelper。在最後一個條件綁定中,使用了通配符*,這也是Beta5上支持的。
    好比  json

    <a href="http://www.cnblogs.com/liontone/">上善若水</a>
    

    就不會被應用上AnchorTagHelper。服務器

  4. 移除Activate attribute
    之前:
    public class MyTagHelper : TagHelper
    {
        [HtmlAttributeNotBound]
        [Activate]
        public IHtmlEncoder Encoder { get; set; }
    
        [HtmlAttributeNotBound]
        [Activate]
        public ViewContext ViewContext { get; set; }
    }
    

    如今:app

    public class MyTagHelper : TagHelper
    {
        public MyTagHelper(IHtmlEncoder encoder)
        {
            Encoder = encoder;
        }
    
        public IHtmlEncoder Encoder { get; }
    
        [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }
    }
  5. 不容許attribute名爲"data-*"
    在beta5中attribute名不能以"data-"開頭,否則在解析taghelper時就會有錯誤拋出。
  6. 新增HtmlAttributeNotBoundAttribute,能夠類中公開的屬性不轉化爲TagHelper的Attribute。
    詳細介紹見這裏
    好比
    public class MyTagHelper : TagHelper
    {
        public MyTagHelper(IHtmlEncoder encoder)
        {
            Encoder = encoder;
        }
    
        public IHtmlEncoder Encoder { get; }
    
        [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }
    }
    

    按照之前文章介紹,ViewContext對應TagHelper的Attribute是view-context,但其實咱們不但願它成爲Attribute,這時只須要加上HtmlAttributeNotBoundAttribute便可,在Visual Studio 2015中也不會有該Attribute的智能提示了。  asp.net

  7. 程序集中內嵌資源key已經迴歸到asp.net 5以前的樣子即namespace + "." + 文件名
    在beta4中key是與文件相對路徑基本一致,這一點比較另類,也許微軟本身也發現了這個問題,到了beta5又迴歸到之前那樣,key的生成是文件的namespace + "." + 文件名。
  8. TagHelperOutput新增了2個新的屬性:PreElement和PostElement。
    不一樣於PreContent和PostContent,利用這兩個屬性能夠輸出內容到當前Tag的前面或後面,你們能夠查看Github上的相應的issue來了解更多信息。
    好比在類中重寫方法:
    public void Process(TagHelperContext context, TagHelperOutput output)
    {
        var nl = Environment.NewLine;
        var br = "<br />" + nl;
        output.PreElement.Append("This will appear before source element" + br);
        output.PreContent.Append(nl + "This will appear before source content" + br);
        output.PostContent.Append(br + "This will appear after source content" + nl);
        output.PostElement.Append(br + "This will appear after source element");
    }
    

    在View上TagHelper:spa

    <my-tag-helper>
        Content in source
    </my-tag-helper>
    

    最後進過解析後生成到頁面的內容是:.net

    This will appear before source element<br />
    <my-tag-helper>
    This will appear before source content<br />
        Content in source<br />
    This will appear after source content
    </my-tag-helper><br />
    This will appear after source element 
  9. project.json中preprocess默認路徑是compiler/preprocess/**/*.cs,這裏文件夾的名稱是小寫,若是程序中是其中文件夾名大寫的話,裏面的代碼不會被執行。
    原來我項目中對應的文件夾都是大寫Compiler/Preprocess,在作beta4升級到beta5支持時,發現裏面的代碼沒有被執行,後來試着在project.json中直接設置preprocess爲Compiler/Preprocess/**/*.cs,這樣是能夠的。可是想着既然文檔中說默認路徑就是這個地址,爲何還要設置呢?就在百思不得其解的時候,忽然發現它上面寫的都是小寫,因而試着把文件夾改爲小寫,果真能夠。真是大坑啊,若是文件夾大小寫敏感,那一開始就要嚴格要求。還不知道正式版發佈後會是什麼狀況,拭目以待吧。
  10. Beta5版的Core的庫愈來愈完善,新增了Hashtable, Arraylist類
    以前beta4版本Core庫中是沒有這兩個類的定義,項目剛好又用到了,那隻好本身添加了類,如今升級到beta5後,又有了,因而就將原來的刪除掉了。隨着正式版的臨近,core庫也會變得愈來愈完善。
  11. 有些庫名稱,類的namespace發生變化,好比:
    • 命名空間從Microsoft.Framework.ConfigurationModel 變成Microsoft.Framework.Configuration
    • Microsoft.Framework.ConfigurationModel.Json庫改名爲Microsoft.Framework.Configuration.Json
    • 移除命名空間Microsoft.AspNet.Http.Core
    • 移除EntityFramewor庫,使用EntityFramework.SqlServer庫來代替
    • 接口ICompileModule中定義的方法參數類型發生變化:類BeforeCompileContext代替接口IBeforeCompileContext,類AfterCompileContext代替接口IAfterCompileContext。
      還有其餘的一些變化,這裏也就沒有一一列出來,你們在實際升級過程當中根據本身項目狀況作相應的修改。
  12. 發現了Beta5的一些已知問題,好比:
    在render section中若是使用AnchorTagHelper,在運行的時候就會出錯,對應的issue報在這裏,這時候我不得不使用AnchorTagHelper,用html element代替它,聽說在beta6中已經修正了。

  上面是我在項目升級過程當中遇到的問題,其實還有不少變化,須要你們根據本身項目狀況來發現,具體beta5詳細變化見這裏code

相關文章
相關標籤/搜索