这是我的模型:
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; }
}
Username
, Email
, and Password
然而由用户提供IsValid
只能由服务器修改,换句话说,如果用户提供true
服务器应该返回BAD REQUEST
或者不考虑这个值。
所以,我可以将属性设置为false
关于模型创建,但它并不干净。
有没有办法将财产私有化或“仅服务器"?
[2018-04-01]:我找到了一个好文章 https://andrewlock.net/preventing-mass-assignment-or-over-posting-in-asp-net-core/ where [BindNever]
已使用,遗憾的是它不适用于传入的数据[FromBody]
正如所指出的。所以目前我只是将属性设置为false
我自己在 POST 处理程序中,但它非常丑陋,因此我仍在寻找其他方法来做到这一点!
[2018-04-02]:终于找到了 !看一下这个 ! https://stackoverflow.com/a/49610576/6331372
创建用户将直接在视图中与之交互的视图模型。尽量不要直接在视图中使用模型,因为这基本上是一种泄漏设计。
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
属性(如果不应该与之交互)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)