假设我们有一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
使用标记声明对象?
是否可以
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>
该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)]
属性都需要这样,如果在设计时修改使用设计器的属性窗口的员工集合,Visual Studio中正确地坚持收藏的标记。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句