2017-10-18 19 views
1

De Microsoft MVC doc, related to Authoring Tag Helpers, je peux lire ceci:Est-ce que Getter et Setter dans ASP.MVC peuvent instancier un objet?

using System; 

namespace AuthoringTagHelpers.Models 
{ 
    public class WebsiteContext 
    { 
     public Version Version { get; set; } 
     public int CopyrightYear { get; set; } 
     public bool Approved { get; set; } 
     public int TagsToShow { get; set; } 
    } 
} 

et ceci:

using System; 
using AuthoringTagHelpers.Models; 
using Microsoft.AspNetCore.Razor.TagHelpers; 

namespace AuthoringTagHelpers.TagHelpers 
{ 
    public class WebsiteInformationTagHelper : TagHelper 
    { 
     public WebsiteContext Info { get; set; } 

     public override void Process(TagHelperContext context, TagHelperOutput output) 
     { 
     output.TagName = "section"; 
     output.Content.SetHtmlContent(
      [email protected]"<ul><li><strong>Version:</strong> {Info.Version}</li> 
      <li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li> 
      <li><strong>Approved:</strong> {Info.Approved}</li> 
      <li><strong>Number of tags to show:</strong> {Info.TagsToShow}</li></ul>"); 
     output.TagMode = TagMode.StartTagAndEndTag; 
     } 
    } 
} 

Je ne ai jamais vu ce genre de code avant, où publique Infos WebsiteContext {get; ensemble; } peut instancier automagiquement un objet ???

Comment ça marche? Y a-t-il de la documentation à ce sujet?

Répondre

1

la réponse est dans le document you linked:

Remarque

Dans le balisage Razor indiqué ci-dessous:

<website-information info="new WebsiteContext { 
           Version = new Version(1, 3), 
           CopyrightYear = 1638, 
           Approved = true, 
           TagsToShow = 131 }" /> 

Razor connaît l'attribut d'information est une classe, pas une chaîne, et que vous voulez écrire du code C#. Tout attribut auxiliaire d'étiquette non-chaîne doit être écrit sans le caractère @.

L'aide de balise elle-même ne sait pas comment instancier l'instance. Vous devez le faire manuellement dans le balisage Razor ou le définir à une valeur par défaut dans la déclaration de la propriété ou le constructeur de la classe afin qu'elle ne soit pas nulle. Voici un exemple de définition de l'instance dans la déclaration de propriété.

public WebsiteContext { get; set; } = new WebSiteContext 
{ 
    Version = new Version(1, 3), 
    CopyrightYear = 1638, 
    Approved = true, 
    TagsToShow = 131 
}; 
0

public WebsiteContext Info { get; set; } n'instancie rien ici. Si vous appelez le code suivant:

var websiteInformationTagHelper = new WebsiteInformationTagHelper();

alors websiteInformationTagHelper.Info sera égal à null

Notez qu'il est maintenant possible dans C# pour attribuer des valeurs par défaut comme le suivant qui est un peu différent de celui ce que vous vous interrogez sur: public WebsiteContext Info { get; set; } = new WebsiteContext()

-1

Pas automatiquement, mais oui. Les mots clés get et set sont des raccourcis pour les méthodes qui sont appelées après l'accès à la propriété (get) ou l'affectation à (set). Vous pouvez ajouter un corps avec un bloc de code régulier:

get { return _backingField; } 
set { _backingField = value; } 

Le mot-clé de valeur représente la valeur étant affectée à la propriété et vous pouvez faire la plupart des choses dans ces blocs, même que toute méthode, y compris l'instanciation d'un objet.

documentation Microsoft - Auto propriétés mises en œuvre:
docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties

Si vous faites référence à instancier l'objet parent, que je ne crois pas logique.