如何在ASP.NET中使用标记声明对象

Gqq*_*big 7 c# asp.net webforms

假设我们有一个Person班级:

public class Person
{
  public string FamilyName {get;set;}
  public string GivenName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

并且有一个控件以某种方式显示人员列表的信息.这是aspx的伪代码:

<uc1:EmployeesViewer runat="server">
  <Employees>
    <Person>
      <GivenName>John</GivenName>
      <FamilyName>Kerry</GivenName>
    </Person>
    <Person>
      <GivenName>Jack</GivenName>  
      <FamilyName>Lew</GivenName>
    </Person>
  <Employees>
</uc1:EmployeesViewer>
Run Code Online (Sandbox Code Playgroud)

EmployeesViewer.EmployeesList<Person>属性的类型[PersistenceMode(PersistenceMode.InnerProperty)].

但是Visual Studio不会编译它.是否可以Person使用标记声明对象?

Mic*_*Liu 8

是否可以Person使用标记声明对象?

是的,只对标记进行了一些小的更改(并且没有对Person类进行任何更改):

<%@ Page Language="C#" CodeBehind="DemoPage.aspx.cs" Inherits="DemoApp.DemoPage" %>
<%@ Register TagPrefix="uc1" Assembly="DemoApp" Namespace="DemoApp" %>

<uc1:EmployeesViewer runat="server">
    <Employees>
        <uc1:Person GivenName="John" FamilyName="Kerry" />
        <uc1:Person GivenName="Jack" FamilyName="Lew" />
    </Employees>
</uc1:EmployeesViewer>
Run Code Online (Sandbox Code Playgroud)

uc1:标记前缀假定您的Person类是在同一集和命名空间为EmployeesViewer.如果没有,只是<%@ Register %>Person的另一个标签前缀.

注意:<uc1:Person>即使Person不是从Control派生,您也可以使用语法:

namespace DemoApp
{
    public class Person
    {
        public string FamilyName {get;set;}
        public string GivenName {get;set;}
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的EmployeesViewer控件,用于呈现员工列表:

namespace DemoApp
{
    [ParseChildren(true)]
    [PersistChildren(false)]
    public class EmployeesViewer : Control
    {
        private readonly List<Person> _employees = new List<Person>();

        [PersistenceMode(PersistenceMode.InnerProperty)]
        public List<Person> Employees
        {
            get { return _employees; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            foreach (Person person in this.Employees)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.P);
                writer.WriteEncodedText(string.Format("{0} {1}", person.GivenName, person.FamilyName));
                writer.RenderEndTag();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

[ParseChildren(true)]需要该属性,以便在运行时ASP.NET将<Employees>标记解释为属性名称而不是要呈现的文字标记.

[PersistChildren(false)][PersistenceMode(PersistenceMode.InnerProperty)]需要的属性,这样,如果在设计时修改使用设计器的属性窗口的员工集合,Visual Studio中正确地坚持收藏的标记.