2

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

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

制作这样的东西很简单:

  • SiteModel用 DataAnnotations声明
  • 声明控制器动作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 篇文章解决了我的问题。
通过 wcf 服务发送具有自定义属性的对象
如何使 WCF 客户端使用与 WCF 服务相同的数据类型

4

2 回答 2

3

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

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

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

于 2013-09-17T16:45:36.373 回答
2

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

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

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

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

于 2013-09-17T17:11:43.217 回答