【问题标题】:How to declare an MVC Model and WCF DataContract in one place?如何在一处声明 MVC 模型和 WCF DataContract?
【发布时间】:2013-09-17 16:27:59
【问题描述】:

我想用 knockout.js 和 MVC 4 创建一个单页网站。

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

制作这样的东西很简单:

  • 使用 DataAnnotations 声明 SiteModel
  • 声明控制器动作public JsonResult Save(SiteModel data)
  • 如果模型有效,则创建 WCF DataContract 的新实例并调用 WCF 方法

代码:

public JsonResult Save(SiteModel data)
{
    if (ModelState.IsValid)
    {
        var ui =  WcfUserInfo{FirstName = data.FirstName};
        if(wcfclient.wcfmethod(ui))
            return Json("IsValid");
    }
    return Json("IsNotValid");
}

是否可以使用 DataAnnotations 创建 DataContract 并在 Save 方法中使用此 DataContract,例如 public JsonResult Save(WcfDataContract data)

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

谢谢。

更新:
这2个帖子解决了我的问题。
Send objects with custom attributes via a wcf service
How to make WCF client use the same data types as the WCF service

【问题讨论】:

    标签: wcf asp.net-mvc-4


    【解决方案1】:

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

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

    PS。如果您使用 AutoMapper,则不必自己进行映射,AutoMapper 将通过两行代码为您处理好:一是配置地图,一是执行映射。

    【讨论】:

    • asymptoticFault 是对的。有2个端点。 Web 服务器部分只是一个中间层。我想像一个简单的服务器验证器一样使用它。检查一些简单的东西,比如名字长度。而且我不想使用 DataAnnotation 属性创建数据合同的副本。
    【解决方案2】:

    作为对 Anton 的回答的反驳(我认为这是一个有效的论点),我可以争辩说这两种表述包含完全相同的关注点。 View Model 是客户端(浏览器)和服务器(Web 服务器)之间的“Data Contract”。 MVC 视图模型WCF 数据契约 都用于建立在两个端点之间通信的已定义数据集。为此,如果您的 WCF 服务Data Contract 的存在仅仅是为了向 Web 服务器和客户端(浏览器)提供您的应用程序数据,那么为什么不使用相同的表示。

    我不相信用DataContractDataMember 属性以及DataAnnotation 属性标记同一个类,例如; RequiredRangeDisplay

    [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; }
    }
    

    重申一下,我并不是说 Anton 是错误的。我只是在陈述另一种观点,因为我认为这个问题更多的是一种观点,而不是一个有正确和错误答案的问题。

    【讨论】:

    • 我尝试使用 [StringLength(50)] 创建 DataContract。然后我添加到我的客户端服务引用到 WCF 测试项目。生成的属性没有 [StringLength(50)]。你有什么建议?
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多