如何在一个地方声明MVC模型和WCF DataContract?

如何在一个地方声明MVC模型和WCF DataContract?,wcf,asp.net-mvc-4,Wcf,Asp.net Mvc 4,我想用knockout.js和mvc4创建一个1页的站点 进行一些更改后,用户将单击一个针对控制器的保存按钮save操作。 控制器端我想验证输入数据。 如果数据有效-我需要调用WCF方法。 如果数据无效,我将向客户端返回一些信息,并告诉他们“名字太长了” 制作这样的东西很简单: 使用数据批注声明SiteModel 声明控制器操作publicJSONResult保存(站点模型数据) 如果模型有效,则创建WCF DataContract的新实例并调用WCF方法 代码: 是否可以使用DataAnn

我想用knockout.js和mvc4创建一个1页的站点

进行一些更改后,用户将单击一个针对控制器的保存按钮
save
操作。
控制器端我想验证输入数据。
如果数据有效-我需要调用WCF方法。
如果数据无效,我将向客户端返回一些信息,并告诉他们“名字太长了”

制作这样的东西很简单:

  • 使用数据批注声明
    SiteModel
  • 声明控制器操作
    publicJSONResult保存(站点模型数据)
  • 如果模型有效,则创建WCF DataContract的新实例并调用WCF方法
代码:

是否可以使用DataAnnotations创建DataContract,并在
保存
方法中使用此DataContract,例如
公共JsonResult保存(WcfDataContract数据)

我只是不想用相同的数据创建和支持两个不同的类:一个MVC模型和一个WCF DataContract

多谢各位

更新:
这两个帖子解决了我的问题


我知道这不是你想听的,但我再强调也不过分: 您与服务的数据契约和视图模型(JSON表示)不应相同。它们是不同的关注点,尽管现在感觉不是这样

鉴于此,如果
SiteModel
WcfUserInfo
相同(即具有相同的属性),是什么阻止了您简单地将它们替换为
WcfUserInfo


注:如果您使用AutoMapper,您不必自己进行映射,AutoMapper将通过两行代码为您解决这一问题:一行用于配置映射,另一行用于执行映射。

作为Anton答案的计数器,我相信这是一个有效的参数,我可以说,这两种说法包含完全相同的关切。除了客户端(浏览器)和服务器(web服务器)之间的“数据契约”,什么是视图模型。MVC视图模型和WCF数据契约都用于建立在两个端点之间通信的已定义数据集。为此,如果您的WCF服务和数据契约仅为向Web服务器和客户端(浏览器)提供应用程序数据而存在,那么为什么不使用相同的表示形式呢

我不认为使用
DataContract
DataMember
属性以及DataAnnotation属性标记同一类会有任何错误,也不会产生任何冲突,例如<代码>必需,
范围
显示
,等等

[DataContract]
public class SiteModel
{
    [DataMember]
    [Display(Name = "First Name")]
    [Required]
    public string FirstName { get; set; }


    [DataMember]
    [Display(Name = "Last Name")]
    [Required]
    public string LastName { get; set; }
}

重申一下,我并不是说安东错了。我只是简单地陈述了另一种观点,因为我认为这个问题更多的是一种观点,而不是一种有对有错的答案。

我试图用[StringLength(50)]创建DataContract。然后我将AD添加到WCF测试项目的客户机服务引用中。生成的属性没有[StringLength(50)]。你能给我什么建议?无症状的错误是正确的。有两个端点。web服务器部件只是一个中间层。我想把它当作一个简单的服务器验证器来使用。检查一些简单的东西,比如名字长度。我不想用DataAnnotation属性创建datacontract的副本。
[DataContract]
public class SiteModel
{
    [DataMember]
    [Display(Name = "First Name")]
    [Required]
    public string FirstName { get; set; }


    [DataMember]
    [Display(Name = "Last Name")]
    [Required]
    public string LastName { get; set; }
}