.NET 团队最喜欢的 Razor 功能 TagHelperPack BlazorWebForms组件 Razor 是一种用于将基于 .NET 的代码嵌入网页的标记语法。它包含 Razor 标记、C# 和 HTML。包含 Razor 的文件通常以 .cshtml 为扩展名。Razor 也包含在 Razor 组件文件 (.razor) 中。 
Razor 的设计理念是轻量级且不显眼,因此您可以专注于标记。然而,它还有很多隐藏的功能,非常实用!我向 .NET 团队的一些朋友询问了他们最喜欢的 Razor 功能,以下是他们的评价。 
我真的很喜欢像缓存这样的标签助手...它太简单了! 
 @page  
@model  ArchivesModel < cache  expires - after = "@TimeSpan.FromHours(4)" > 
    @foreach  ( var  show  in  Model . Shows ) 
    { 
     < a  href = "@show.AsAwesomeUrl()"  class =" showCard ">
       < img  data - src = "@(" https : //images.hanselminutes.com/podcast/shows/"  
        +  show . Number  +  ".jpg" ) "
         loading = "lazy"  class =" lazyload " 
         src = "/images/grey.gif"  width = "212"  height = "212"  
        alt = "@show.Title"  /> 
      < span  class =" shownumber ">@show.Number</span>
       < div  class =" overlay  title ">
        <!--  cant  add  padding  to  the  wrapping  div  or  the  layout  gets  
        messed  up ,  title  will  be  wrapped  in  a  p  tag 
       which  will  have  the  padding  added  to  it  --> 
       < p  class =" overlay - text ">@show.Title</p>
       </ div > 
     </ a > 
    } 
</ cache > 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:缓存标签助手 
这是 Razor 的核心功能,允许您直接从 cshtml 调用 C# 异步代码! 
 < p > @await  DoSomethingAsync ( "Hello" ,  "from" ,  "async" )</ p > 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:隐式 Razor 表达式 
标记帮助程序使服务器端代码能够参与创建和渲染 Razor 文件中的 HTML 元素。它有很多内置的标记帮助程序,但您也可以轻松编写自己的标记帮助程序。 
下面是一个标记助手的示例 asp-if,如果提供的谓词等于 false,它会抑制元素的输出。 
 [ HtmlTargetElement ( "*" ,  Attributes  =  "asp-if" )] 
public  class  IfTagHelper  :  TagHelper 
{ 
    /// <summary> 
    /// The predicate expression to test. 
    /// </summary> 
    [ HtmlAttributeName ( "asp-if" )] 
    public  bool  Predicate  {  get ;  set ;  } public  override  void  Process ( TagHelperContext  context ,  
        TagHelperOutput  output ) 
    { 
        if  (! Predicate ) 
        { 
            output . SuppressOutput (); 
        } 
    } 
} 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
使用方法如下: 
 <div  asp-if= "(DateTime.UtcNow.Minute % 2) == 0" > 
  This paragraph will only render during <strong> even</strong>  minutes.
</div> 
<div  asp-if= "(DateTime.UtcNow.Minute % 2) == 1" > 
  This paragraph will only render during <strong> odd</strong>  minutes.
</div> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
我已经在这个TagHelper Pack Samples 存储库中编写了很多示例标签助手 。 
 
  
  一组有用的、可能有自己观点的 ASP.NET Core 标签助手  
 
  
   
    
     TagHelperPack  
    一组适用于 ASP.NET Core(所有版本)的有用且可能有意见的标签助手。 
    
     
包含的标签助手和示例 请参阅https://taghelperpack.net 上的示例页面 
    支持 ASP.NET Core 6.0.x 和 7.0.x。在 .NET Framework 4.7.1 或更高版本上运行时,还支持 ASP.NET Core 2.1.x。 
    
     
安装 
     
      从 cmd 行添加对包的引用: 
      
       MyGreatProject>  dotnet add package TagHelperPack 
       
        
         
          
           Enter fullscreen mode
             
         
          
           Exit fullscreen mode
             
         
        
        
     
      恢复: 
      
       MyGreatProject>  dotnet restore 
       
        
         
          
           Enter fullscreen mode
             
         
          
           Exit fullscreen mode
             
         
        
        
     
      在应用程序的文件中注册标记帮助程序 _ViewImports.cshtml: 
      
       @addTagHelper  *, TagHelperPack
        
         
          
           Enter fullscreen mode
             
         
          
           Exit fullscreen mode
             
         
        
        
     
      ConfigureServices()可选:在或 中注册优化 Program.cs(ASP.NET Core 6+) 
      
       services. AddTagHelperPack ( ) ;  
       
        
         
          
           Enter fullscreen mode
             
         
          
           Exit fullscreen mode
             
         
        
        
     
    
   
  
  
  
 
 
 
 
文件中的任何东西 .razor都是一件艺术品😍 
模板化组件非常有用。它们接受一个或多个 UI 模板作为参数,这些模板随后可用作组件渲染逻辑的一部分。模板化组件允许您编写比以前更高级、可复用的组件。例如,列表视图组件可以允许用户指定用于渲染列表中项目的模板,或者网格组件可以允许用户指定网格标题和每一行的模板。 
 < h1 > Pets </ h1 > < TableTemplate  Items = "pets"  Context = "pet" > 
    < TableHeader > 
        < th > ID </ th > 
        < th > Name </ th > 
    </ TableHeader > 
    < RowTemplate > 
        < td > @pet . PetId </ td > 
        < td > @pet . Name </ td > 
    </ RowTemplate > 
</ TableTemplate > @code  { 
    private  List < Pet >  pets  =  new () 
    { 
        new  Pet  {  PetId  =  2 ,  Name  =  "Mr. Bigglesworth"  }, 
        new  Pet  {  PetId  =  4 ,  Name  =  "Salem Saberhagen"  }, 
        new  Pet  {  PetId  =  7 ,  Name  =  "K-9"  } 
    }; private  class  Pet 
    { 
        public  int  PetId  {  get ;  set ;  } 
        public  string  Name  {  get ;  set ;  } 
    } 
} 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:模板组件 
  ViewComponentTagHelpers - 泰勒·穆伦 您可以创建一个 ViewComponent 并让它返回内容、视图或执行任何其他复杂的逻辑: 
 using  Microsoft.AspNetCore.Mvc ; namespace  WebApplication3000 
{ 
   public  class  Foo :  ViewComponent 
   { 
       public  IViewComponentResult  Invoke () 
       { 
           return  Content ( "Hello, World!" ); 
       } 
   }    
} 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
然后它们立即被转换成您可以在视图中使用的 TagHelpers: 
 @addTagHelper  *,  WebApplication3000 < vc : foo  /> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:视图组件 
@inject太🔥🔥🔥了!我很高兴我能做到这一点——简直太棒了。 
以下是注入配置的示例: 
 @using  Microsoft . Extensions . Configuration 
@inject  IConfiguration  Configuration 
@ { 
   string  myValue  =  Configuration [ "root:parent:child" ]; 
   ... 
} 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
您还可以注入服务: 
 @using  System . Threading . Tasks 
@using  ViewInjectSample . Model 
@using  ViewInjectSample . Model . Services 
@model  IEnumerable < ToDoItem > 
@inject  StatisticsService  StatsService 
<! DOCTYPE  html > 
< html > 
< head > 
    < title > To  Do  Items </ title > 
</ head > 
< body > 
    < div > 
        < h1 > To  Do  Items </ h1 > 
        < ul > 
            < li > Total  Items :  @StatsService . GetCount ()</ li > 
            < li > Completed :  @StatsService . GetCompletedCount ()</ li > 
            < li > Avg .  Priority :  @StatsService . GetAveragePriority ()</ li > 
        </ ul > 
        < table > 
            < tr > 
                < th > Name </ th > 
                < th > Priority </ th > 
                < th > Is  Done ?</ th > 
            </ tr > 
            @foreach  ( var  item  in  Model ) 
            { 
                < tr > 
                    < td > @item . Name </ td > 
                    < td > @item . Priority </ td > 
                    < td > @item . IsDone </ td > 
                </ tr > 
            } 
        </ table > 
    </ div > 
</ body > 
</ html > 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:ASP.NET Core 中的视图依赖注入 
我喜欢 Razor 组件库。只需编写一个 .razor 文件,它就是一个可以引用的组件。我在 BlazorWebFormsComponents 项目中经常使用它们,这有助于将 ASP.NET Web Forms 项目迁移到 Blazor。 
这是一个示例 Label组件,实现如下 Label.razor: 
 @inherits BaseWebFormsComponent<span  id= "@ID" > @Text</span> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
逻辑在于 Label.razor.cs: 
 using  BlazorWebFormsComponents.Interfaces ; 
using  Microsoft.AspNetCore.Components ; namespace  BlazorWebFormsComponents 
{ 
    public  partial  class  Label  :  BaseWebFormsComponent ,  ITextComponent 
    { 
        [ Parameter ] 
        public  string  Text  {  get ;  set ;  } 
    } 
} 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
 
  
  Blazor 组件的集合,模拟同名的 ASP.NET Web 窗体控件  
 
  
   
    
     
BlazorWebForms组件 Blazor 组件的集合,模拟同名的 Web 表单组件 
    
    
    在 Azure 上运行的实时示例 
    
     
方法 + 注意事项 我们相信,维护良好且有价值的 Web 窗体应用程序应该能够以最少的更改过渡到新的用户界面框架。这并非应用程序转换,也不是一个可以应用到您的项目中并神奇地使其与 ASP.NET Core 兼容的补丁。此存储库包含一个库和一系列策略,可让您重用大量标记和业务代码,并帮助缩短应用程序重写过程。 
    这并不适用于所有人,并非每个人都需要迁移他们的应用程序。它们可以继续以 Web Forms 的形式获得长期支持(截至撰写本文时,支持期限为 2029 年),并且考虑迁移的应用程序…… 
    
   
  
 
 
 
 
这是一个非常有用的 Razor 代码片段。这是我喜欢 Razor 语法的原因之一,我不仅可以运用我现有的 C# 技能,还可以使用所有能够让我成为高效开发人员的语言特性。 
 @using  static  System . Runtime . InteropServices . RuntimeInformation < div  class =" built - with ">
     @FrameworkDescription 
</ div > 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
没错,你没有看错,这实际上是一个 using static声明——这意味着该类型的所有静态成员都 System.Runtime.InteropServices.RuntimeInformation可以使用,而无需使用类型限定符。我可以使用强大的模板引擎将 HTML 和 C# 无缝地结合在一起,从而创建富内容。这只是一个简单的例子,但还有很多其他例子。你的想象力以及围绕 HTML 和 C# 语义的结构限制了你。当它被渲染为 HTML 时,你最终会得到一个 <div>包含 .NET 框架描述的元素。我喜欢在我的 .NET 应用中看到运行时版本💜。 
生成的 HTML: 
 <div  class= "built-with" >  </div> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
在大多数情况下,Razor 会在 C# 和 HTML 之间隐式转换,无需您费心。有时,在 C# 代码中显式地将代码块调用为内联 HTML 文本会很有用。您可以使用显式转换来实现这一点。例如,如果您在 C# 代码块中编写 JavaScript 或 CSS,这将非常有用。 
您可以使用 <text></text>标签结构来划分一个块,也可以将其用于 @:单行。 
 <script> 
@ for ( int  i  =  0 ;  i  <  10 ;  i ++ )  
{ 
    @: console . log (@ i ); 
} 
</script> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
这将呈现: 
 <script> 
    console . log ( 0 ); 
    console . log ( 1 ); 
    console . log ( 2 ); 
    console . log ( 3 ); 
    console . log ( 4 ); 
    console . log ( 5 ); 
    console . log ( 6 ); 
    console . log ( 7 ); 
    console . log ( 8 ); 
    console . log ( 9 ); 
</script> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
这对于渲染包含服务器上填充的数据的图表等操作非常方便,如下所示: 
 @section Scripts {
<script  src= "https://canvasjs.com/assets/script/canvasjs.min.js" ></script> 
<script> 
    window . onload  =  function  ()  { 
        var  dataPoints  =  []; 
        var  chart  =  new  CanvasJS . Chart ( " chartContainer " ,  { 
            animationEnabled :  true , 
            data :  [ 
                { dataPoints :  dataPoints 
                } 
            ] 
        }); 
        @{ Random  rand  =  new  Random ();} 
        @ for ( int  i  =  0 ;  i  <  10 ;  i ++ ) 
        { 
            @: dataPoints . push ({  x :  @ i ,  y :  @ rand . Next ( 0 ,  100 )  }); 
        } chart . render (); 
    }; 
</script> 
  
   
    
     Enter fullscreen mode
       
   
    
     Exit fullscreen mode
       
   
  
 
文档:ASP.NET Core 中的视图依赖注入 
  详细了解 Razor 和 Razor Pages 想了解更多关于 Razor 和 Razor Pages 的知识?快来观看这个 2 小时的入门视频: 一起学习 .NET:Razor Pages 。 
 VIDEO 
  你呢? 有你喜欢的 Razor 功能想分享吗?欢迎在评论区留言! 
文章来源:https://dev.to/dotnet/the-net-team-s-favorite-razor-features-5b72