.NET MVC 4.5 - 在运行时将必需"属性添加到数据模型



我有这个数据传输模型:

[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可能已被禁用。)

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

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

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

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

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

希望这对你有帮助。

最新更新