Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何不将属性与JSON数据绑定_C#_Asp.net_Json_Asp.net Web Api - Fatal编程技术网

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]
完成的,所以我认为这是一个好模式。