0

我有这个数据传输模型:

[DataContract]
[Serializable]
class PersonDTO {

    [DataMember(Name="id")]
    public int id { get; set; }


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


}

我希望能够将此模型用于创建和更新操作。这里的问题是,当创建一个新的 Person 时,它的 id 还不存在(因此缺少 [Required] 注释)。然而,在更新时,id 已经存在,并且需要是必填字段。

在我的控制器中,我有以下操作:

public class PersonController {

    [HttpPut]
    public void UpdatePerson(PersonDTO person) {}

    [HttpPost]
    public void CreatePerson(PersonDTO person) {}

}

有没有办法为这两个操作使用相同的 DTO,但为其中一个操作设置字段“id”,所以 ModelState 失败?我知道我可以通过检查手动完成person.id == null,但我正在寻找一个自动解决方案,如果存在的话。

4

1 回答 1

1

我不知道您是否还需要这方面的帮助,但我偶然发现了您的问题,因为我正在寻找类似的答案。我刚刚想出了一个简单的方法来实现你正在寻找的东西。这有点作弊,但它有效。

在页面标记中,只需将“data_val_required”添加到相关字段的样式中,然后添加所需的错误消息。

例如:

@Html.PasswordFor(model => model.OldPassword, 
                           new { data_val_required="The Old Password field is required." })

客户端验证器选择它并在验证摘要中显示适当的消息。

在服务器端,您必须记住在代码中验证您的模型并手动检查字段的内容,因为您不能依赖客户端验证来工作(例如,JavaScript 可能已被禁用。)

我想这样做的原因是在更改密码页面中。我的模型包含三个字段:

  1. 旧密码
  2. 新密码 [必填]
  3. 确认密码 [必填]

仅当用户自己决定更改密码时才需要旧密码。如果我强制用户重置他/她的密码(因为他们丢失了旧密码),则不需要旧密码(因为他们不知道!)

因此,如果用户自愿更改密码,我在客户端有一些代码发出“data_val_required”,如果不是,则删除整个字段。

我在服务器端也有代码来检查这两种情况。

希望这对您有所帮助。

于 2012-12-19T02:16:36.813 回答