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

标签 c# asp.net webforms

假设我们有一个 Person类:

public class Person
{
  public string FamilyName {get;set;}
  public string GivenName {get;set;}
}

还有一个控件可以以某种方式显示人员列表的信息。这是 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>

EmployeesViewer.Employees类型为 List<Person> , 属性为 [PersistenceMode(PersistenceMode.InnerProperty)] .

但是 Visual Studio 不会编译它。是否可以申报 Person对象使用标记?

最佳答案

Is it possible to declare a Person object using markup?

是的,只对标记做了一些小改动(没有你的 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>

uc1:标记前缀假定您的 Person 类与 EmployeesViewer 位于相同的程序集和命名空间中。如果没有,就<%@ Register %> Person 的另一个标签前缀。

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

namespace DemoApp
{
    public class Person
    {
        public string FamilyName {get;set;}
        public string GivenName {get;set;}
    }
}

这是一个呈现员工列表的简单 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();
            }
        }
    }
}

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

[PersistChildren(false)][PersistenceMode(PersistenceMode.InnerProperty)]属性是必需的,这样,如果在设计时您使用设计器的“属性”窗口修改了 Employees 集合,Visual Studio 会正确地将集合保存到标记中。

关于c# - 如何在 ASP.NET 中使用标记声明对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462527/

相关文章:

c# - HttpClient,输出有关下载过程的信息

asp.net - 不允许使用 HTTP 动词 POST 来访问路径 '/'

javascript - 在 Cloudfront 后面时,.net webforms 站点中缺少 WebResource.axd

Java BC SicBlockCipher直接输出等价于c#

c# - 加载场景时删除额外的音频监听器

c# - 使用 wcf 服务发送带有 html body true 和图像的电子邮件

c# - 设置加载指示器的位置

asp.net - 发布到 Azure 失败,出现 500 内部服务器错误

使用外部数据库的 ASP.net Web 窗体应用程序登录

asp.net - VirtualPath 在当前应用程序根目录之外