假设我们有一个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
对象?
答案 0 :(得分:2)
除了学术上的原因,我不确定你为什么要这样做。由于其他一些海报主要集中在使用控件来创建标记,为什么不使用像DataSet这样的东西来实现你想要实现的目标呢?
您可以通过从Add&gt;中选择DataSet来创建数据集。新商品&gt;数据&gt;来自上下文菜单的DataSet。 DataSet可以是强类型的,并为您提供完整的Intellisense功能,但这可能不适合您的场景。我以为我会把这个想法抛在那里。
使用DataSet:
进程:创建DataSet,创建DataTable,为DataTable创建列(DataColumns),实例化并绑定到给定的.aspx控件。
标准数据集/ DataTable / DataColumn:
DataSet ds = new DataSet("MyDataSetNameSpace");
DataTable person = new DataTable();
//add columns to the datatable
person.Columns.Add(new DataColumn(typeof(string)), "FamilyName");
person.Columns.Add(new DataColumn(typeof(string)), "GivenName");
强类型数据集:
PersonDataSet personDs = new PersonDataSet("PersonDataSetNameSpace");
//DataTable should already exist in your strongly-typed DataSet because you define the datatables in the vs designer
//accessing the datatable
personDs.Person person = new PersonDataSet.Person();
person.GivenName = "John Eisenhower Smith";
person.FamilyName = "Johnny";//nickname? I'm guessing this might actually be Smith
如果要在Markup中使用DataSet,可以将其绑定到您尝试使用的列表控件。
//you can define the DataSource in Markup or in CodeBehind. You'd have to define a protected or public variable so that you can access the item in your markup.
//In markup, you would set DataSource = <%# Person%>
myGridViewControl.DataBind();//bind the dataset/datatable to the control
MSDN参考:
https://msdn.microsoft.com/en-us/library/ss7fbaez(v=vs.110).aspx
要完成使用XAML完成的任务,您必须通过使用Silverlight控件注入XAML。有关如何执行此操作的详细信息,请参阅此文章:
Is there a way to insert Silverlight XAML into my page using ASP.NET code-behind?
简短的回答是在WebForms中,目前无法完成。你必须用黑客来完成这个,因为框架不支持它。您可以使用C#代码块来执行您尝试执行的操作,但您仍然无法完成正在尝试正确执行的操作。
答案 1 :(得分:1)
你不能将Person作为用户控件吗? 并按原样添加:
<uc1:EmployeesViewer runat="server">
<Employees>
<uc1:Person GivenName="John"/>
</Employees>
<uc1:EmployeesViewer/>
修改强>
做了一个测试例子。 将以下内容添加到employeesView以便能够访问标记中的人员:
Private _emptyDataTemplate As New List(Of Person)
<Browsable(False)>
<PersistenceMode(PersistenceMode.InnerProperty)>
<TemplateContainer(GetType(Person))>
Public ReadOnly Property Persons() As List(Of Person)
Get
Return _emptyDataTemplate
End Get
End Property
制作人员课程:
Public Class Person
Inherits System.Web.UI.UserControl
Private msFirstName As String
Public Property FirstName() As String
Get
Return msFirstName
End Get
Set(ByVal value As String)
msFirstName = value
End Set
End Property
End Class
在main.aspx中,我将其添加到标记中:
<!-- top of page -->
<%@ Register TagPrefix="pd" TagName="Person" Src="Person.ascx" %>
<%@ Register TagPrefix="pd" TagName="pView" Src="WebUserControl1.ascx" %>
<!-- wherever you use employeesView -->
<pd:EmployeesView ID="PView1" runat="server">
<Persons>
<pd:Person ID="Person2" FirstName="blabal" runat="server"></pd:Person>
<pd:Person ID="Person3" FirstName="bobba" runat="server"></pd:Person>
</Persons>
</pd:EmployeesView>
希望有所帮助:)
答案 2 :(得分:1)
是的,这是可能的。
<% Person person1 = new Person();
person1.FamiliName="Brown";
person1.GivenName="John";
List<Person> persons = new List<Person>();
persons.Add(person1);
EmployeesViewer.DataSource = persons;
%>
答案 3 :(得分:-1)
这是可能的。然而,它完全是它自己的动物。虽然这种方法都是微软的,但它的应用却令人惊讶。
您可以使用xsd style sheets格式化数据。然后插入一个对象,然后渲染该对象。在某些版本的visual studio中,甚至还有样式表中generating对象模型的方法。
GL