Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DisplayAttribute name属性在Silverlight中不工作_C#_Asp.net_Wcf_Silverlight - Fatal编程技术网

C# DisplayAttribute name属性在Silverlight中不工作

C# DisplayAttribute name属性在Silverlight中不工作,c#,asp.net,wcf,silverlight,C#,Asp.net,Wcf,Silverlight,我正在将DataGrid.ItemsSource属性绑定到列表对象。我通过启用Silverlight的WCF服务获取数据。因此,PersonDetails类在Web项目中实现。如果类位于Silverlight项目中,则每个DataGrid的标题文本都会根据我的需要进行更改。但是我不能在web服务中使用这个类。唯一的解决方案是向两个项目中添加相同的类。但是,还有别的办法吗 这个班看起来是这样的: [DataContract] public class PersonGeneralDetails {

我正在将
DataGrid.ItemsSource
属性绑定到
列表
对象。我通过启用Silverlight的WCF服务获取数据。因此,
PersonDetails
类在Web项目中实现。如果类位于Silverlight项目中,则每个DataGrid的标题文本都会根据我的需要进行更改。但是我不能在web服务中使用这个类。唯一的解决方案是向两个项目中添加相同的类。但是,还有别的办法吗

这个班看起来是这样的:

[DataContract]
public class PersonGeneralDetails
{
    // Properties

    [DataMember]
    [DisplayAttribute(Name = "Sira")]
    public int RowNumber { get; set; }

    [DataMember]
    [DisplayAttribute(Name = "Seriyasi")]
    public string SerialNumber { get; set; }
}
在web项目中似乎没有生成属性。我知道我可以使用DataGrid事件更改标题文本。但我想使用属性使其工作。

问题在于WCF
DataContract
是一种可跨语言和平台使用的互操作机制

如果查看由
DataContractSerializer
生成的序列化数据(或其在
System.Runtime.Serialization.dll
中的代码,特别是
InternalWriteObjectXyz()
方法),您会发现它只是将值序列化为简单的XML消息。没有与.NET Framework相关的内容,因此所有类型的属性,包括自定义属性和编译器生成的属性,都将被剥离,客户端甚至不会接收到

它可以创建数据的副本并将它们从服务器发送到客户端,然后客户端将创建具有相同签名的新类。注意:具有相同签名的新类,而不仅仅是原始类的新对象

当然,有一些解决办法。您可以编写自己的序列化程序(参见示例)或自己的
iSerializationSubrogate

如果您可以将程序集部署/共享到您的客户端,那么您就有了一个很好的解决方法:只需部署它们,
DataContractSerializer
将在您的客户端上构建正确的对象(与服务器上的对象及其所有属性完全相同)。请记住:

  • 如果自定义属性来自运行时值(例如,因为本地化),那么它们将在客户端上解析,而不是在服务器上解析(因为属性将在客户端上创建,所以它们的值不会包含在XML消息中)
  • 在客户端应用程序中,需要添加对包含类型的程序集的引用
  • 添加服务引用时,您必须指示VS使用它们(否则它将创建代理),在服务引用设置对话框中,选择重用引用程序集中的类型(您可以将此限制为仅要共享的程序集)

另外,我还有一个问题。我在研究你给我的解决方案。我偶然发现添加类作为链接。这是否意味着部署/共享程序集?@FarhadJabiyev RIA Services?我不知道他们是否“保留”属性,让我知道它是否有效!在Silverlight项目中单击“添加现有项”后,我选择web项目中的类。有两种选择:添加类和添加类作为链接。不,不是RIA。这是启用Silverlight的WCF服务。@FarhadJabiyev您可以克隆它们。然后,将您想要共享的所有内容都放在一个共享程序集中并进行部署,这会更加“干净”。如果您不想部署逻辑,您可能需要将其移动到派生类(在另一个未部署的程序集中)