假设我们有一个 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/