2015-08-08 6 views
12

MVC 6 introduce Tag Helpers come alternativa migliore a @ Html.EditorFor. È possibile creare un modello di editor personalizzato. È anche possibile creare un Tag Helper personalizzato.MVC 6 Tag helper come sostituzione per i modelli di editor

Tuttavia, durante la creazione di Tag Helper, l'HTML deve essere creato dal codice C# (utilizzando TagBuilder, ecc.). Per gli helper tag complessi non è conveniente quanto l'utilizzo della sintassi del rasoio.

C'è un modo che mi manca che mi consentirebbe di creare un Tag Helper personalizzato da una pagina Razor?

risposta

11

La bellezza di TagHelper s è che è possibile combinare C# e Razor in molti modi diversi. Allora supponiamo di avere un modello di rasoio personalizzato come ad esempio:

CustomTagHelperTemplate.cshtml

@model User 

<p>User name: @Model.Name</p> 
<p>User id: @Model.Id</p> 

E tu hai il modello:

namespace WebApplication1 
{ 
    public class User 
    { 
     public string Name { get; set; } 
     public int Id { get; set; } 
    } 
} 

E il TagHelper:

using System.IO; 
using System.Threading.Tasks; 
using Microsoft.AspNet.Mvc; 
using Microsoft.AspNet.Mvc.Rendering; 
using Microsoft.AspNet.Razor.Runtime.TagHelpers; 
using Microsoft.Framework.WebEncoders; 

namespace WebApplication1 
{ 
    public class UserTagHelper : TagHelper 
    { 
     private readonly HtmlHelper _htmlHelper; 
     private readonly IHtmlEncoder _htmlEncoder; 

     public UserTagHelper(IHtmlHelper htmlHelper, IHtmlEncoder htmlEncoder) 
     { 
      _htmlHelper = htmlHelper as HtmlHelper; 
      _htmlEncoder = htmlEncoder; 
     } 

     [ViewContext] 
     public ViewContext ViewContext 
     { 
      set 
      { 
       _htmlHelper.Contextualize(value); 
      } 
     } 

     public string Name { get; set; } 

     public int Id { get; set; } 

     public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
     { 
      output.TagName = null; 
      output.SelfClosing = false; 

      var partial = await _htmlHelper.PartialAsync(
       "CustomTagHelperTemplate", 
       new User 
       { 
        Name = Name, 
        Id = Id 
       }); 

      var writer = new StringWriter(); 
      partial.WriteTo(writer, _htmlEncoder); 

      output.Content.SetContent(writer.ToString()); 
     } 
    } 
} 

È quindi possibile scrivere t egli pagina seguente:

@addTagHelper "*, WebApplication1" 

<user id="1234" name="John Doe" /> 

che genera:

<p>User name: John Doe</p> 
<p>User id: 1234</p> 
+2

Così HTML Helper non sono effettivamente deprecato, ma piuttosto sono integrate dalle Helpers tag? –

+2

Non avrei potuto metterlo meglio io! Sì :) –

+0

è possibile fornire il modello (Utente) dalla mia pagina, poniamo il sottomodello del mio modello principale, invece di istanziarlo nel metodo ProcessAsync in tag helper class? –