C# 如何不将属性与JSON数据绑定
这是我的模型:C# 如何不将属性与JSON数据绑定,c#,asp.net,json,asp.net-web-api,C#,Asp.net,Json,Asp.net Web Api,这是我的模型: public sealed class UserModel { [Key] [Required] [StringLength(20, MinimumLength = 4)] public string Username { get; set; } [Required] [EmailAddress] [DataType(DataType.EmailAddress)] public string Email { get
public sealed class UserModel
{
[Key]
[Required]
[StringLength(20, MinimumLength = 4)]
public string Username { get; set; }
[Required]
[EmailAddress]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 4)]
public string Password { get; set; }
public bool IsValid { get; set; }
}
用户名
、电子邮件
和密码
由用户提供,但是是否有效
只能由服务器修改,换句话说,如果用户提供true
,服务器应返回错误请求
,或者不考虑该值
因此,我可以在创建模型时将属性设置为false
,但它不是干净的。
有没有一种方法可以将属性设置为私有或“仅限服务器”
[2018-04-01]:
我发现了一个使用了[BindNever]
的地方,遗憾的是,它无法处理前面提到的[FromBody]
数据。因此,目前我只是在POST处理程序中将属性设置为false
,但它非常难看,因此我仍在寻找其他方法来实现它
[2018-04-02]:
终于找到了 创建用户将在视图中直接与之交互的视图模型。尽量不要在视图中直接使用模型,因为这基本上是一个漏洞百出的设计
public class UserViewModel {
[Required]
[StringLength(20, MinimumLength = 4)]
public string Username { get; set; }
[Required]
[EmailAddress]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 4)]
public string Password { get; set; }
}
在服务器端,当持久化数据时,属性将被复制到模型中。任何需要设置的附加属性都可以安全地在服务器上完成,因为模型不会泄露给客户端
比如说
public ActionResult Post([FromBody] UserViewModel viewModel) {
if(ModelState.IsValid) {
//create new model
var model = new UserModel {
Username = viewModel.Username,
Email = viewModel.Email,
Password = viewModel.Password
};
//or model retrieved from data storage
//...some other code...
model.IsValid = true; //only the server can modify this value
//...
}
//...
}
如果客户端不想与
IsValid
属性进行交互,那么客户端甚至不应该知道该属性。最终找到了干净的方法!将public
更改为private
?@MikeMcCaughan我尝试过,但似乎private字段未在数据库中注册..:/你确定这是个漏洞百出的设计吗?我太失望了!它是如此干净美丽,这是微软推荐的方式吗?@AlexandreDaubricourt想一想。客户端是否有理由操纵该属性?如果答案是否定的,那么为什么要将其发送给客户机呢。通信只需要知道。当然,客户端不能操纵IsValid
,这就是为什么有/应该有一种方法来防止某些属性绑定的原因。我的意思是,在某些情况下,这是通过[NeverBind]
完成的,所以我认为这是一个好模式。