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

时间:2016-04-06 21:17:21

标签: 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对象?

4 个答案:

答案 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