ASP.MVC中的Getter和Setter是否可以实例化对象?

时间:2017-10-18 13:34:07

标签: c# asp.net-mvc oop razor asp.net-core-tag-helpers

Microsoft MVC doc, related to Authoring Tag Helpers,我可以读到这个:

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

和此:

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

之前我从未见过这种代码,其中公共WebsiteContext Info {get;组; 可以自动实例化对象???

它是如何工作的?有没有关于它的文件?

3 个答案:

答案 0 :(得分:1)

答案在document you linked

  

注意

     

在下面显示的Razor标记中:

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

Razor知道info属性是一个类,而不是一个字符串,并且你想编写C#代码。应该在没有@字符的情况下编写任何非字符串标记辅助属性。

标记帮助程序本身并不知道如何实例化该实例。您必须在Razor标记中手动执行此操作,或者在属性声明或类构造函数中将其设置为默认值,以使其为非null。以下是在属性声明中设置实例的示例。

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

答案 1 :(得分:0)

public WebsiteContext Info { get; set; }没有在这里实例化任何内容。如果您拨打以下代码:

var websiteInformationTagHelper = new WebsiteInformationTagHelper();

然后websiteInformationTagHelper.Info将等于null

注意,现在可以在c#中分配如下所示的默认值,这与您想知道的有点不同: public WebsiteContext Info { get; set; } = new WebsiteContext()

答案 2 :(得分:-1)

不是自动的,但是是的。 get和set关键字是在访问(get)或分配(set)属性后调用的方法的简写。您可以添加具有常规代码块的正文:

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

value关键字表示分配给属性的值,您可以在这些块中执行大多数操作,与任何方法相同,包括实例化对象。

Microsoft文档 - 自动实现的属性:
docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties

如果你指的是实例化父对象,那我不相信是有道理的。