我有这个数据传输模型:
[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
手动完成,但我正在寻找一个自动解决方案,如果存在的话。
我不知道你是否还需要帮助,但我偶然发现了你的问题,因为我正在寻找类似的答案。我刚刚想出了一个简单的方法来实现你想要的。这有点作弊,但有效。
在页面标记中,只需在有问题的字段的样式中添加"data_val_requested",然后添加所需的错误消息。
例如:
@Html.PasswordFor(model => model.OldPassword,
new { data_val_required="The Old Password field is required." })
客户端验证器接收到这一信息,并在验证摘要中显示相应的消息。
在服务器端,您必须记住在代码中验证您的模型,并手动检查字段的内容,因为您不能依赖客户端验证来工作(例如,JavaScript可能已被禁用。)
我想这样做的原因是在"更改密码"页面中。我的模型包含三个字段:
- 旧密码
- 新密码[必需]
- 确认密码[必需]
只有当用户自己决定更改密码时,才需要旧密码。如果我强迫用户重置他/她的密码(因为他们丢失了旧密码),那么不应该需要旧密码(因为我不知道!)
因此,如果用户自愿更改密码,我在客户端有一些代码来发出"data_val_requid",如果不更改密码,则删除整个字段。
我在服务器端也有代码来检查这两种情况。
希望这对你有帮助。