De documento de Microsoft MVC, relacionado con Authoring Tag Helpers, puedo leer esto:

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; }
    }
}

Y esto:

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(
             $@"<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;
      }
   }
}

Nunca vi este tipo de código antes, donde Información pública del contexto del sitio web {get; conjunto; } puede instanciar automáticamente un objeto ???

¿Cómo funciona? ¿Hay alguna documentación al respecto?

1
user8773215 18 oct. 2017 a las 16:34

3 respuestas

La mejor respuesta

La respuesta está en el documento que vinculó:

Nota

En el marcado de Razor que se muestra a continuación:

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

Razor sabe que el atributo info es una clase, no una cadena, y desea escribir código C #. Cualquier atributo auxiliar de etiqueta que no sea de cadena debe escribirse sin el carácter @.

El asistente de etiqueta en sí mismo no sabe cómo instanciar la instancia. Debe hacerlo manualmente en el marcado de Razor o establecerlo en un valor predeterminado en la declaración de propiedad o el constructor de clase para que no sea nulo. Aquí hay un ejemplo de configuración de la instancia en la declaración de propiedad.

public WebsiteContext { get; set; } = new WebSiteContext 
{ 
    Version = new Version(1, 3),
    CopyrightYear = 1638,
    Approved = true,
    TagsToShow = 131
};
1
Community 20 jun. 2020 a las 09:12

No automáticamente, pero sí. Las palabras clave get y set son abreviaturas de los métodos que se invocan después de que se accede a la propiedad (get) o se le asigna (set). Puede agregar un cuerpo con un bloque de código regular:

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

La palabra clave value representa el valor que se asigna a la propiedad y puede hacer la mayoría de las cosas en esos bloques, igual que cualquier método, incluida la creación de instancias de un objeto.

Documentación de Microsoft - Propiedades implementadas automáticamente:
docs.microsoft. com / en-us / dotnet / csharp / programacion-guia / clases-y-estructuras / propiedades-auto-implementadas

Si te refieres a crear instancias del objeto padre, eso no creo que tenga sentido.

-1
ryanwebjackson 18 oct. 2017 a las 13:46

public WebsiteContext Info { get; set; } no está instanciando nada aquí. Si llama al siguiente código:

var websiteInformationTagHelper = new WebsiteInformationTagHelper();

Entonces websiteInformationTagHelper.Info será igual a null

Tenga en cuenta que ahora es posible en c # asignar valores predeterminados como el siguiente, que es un poco diferente de lo que se está preguntando: public WebsiteContext Info { get; set; } = new WebsiteContext()

0
GregH 18 oct. 2017 a las 13:44