Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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#数据类型模型验证_C#_Json_Rest_Model Validation - Fatal编程技术网

如何在进入控制器之前处理C#数据类型模型验证

如何在进入控制器之前处理C#数据类型模型验证,c#,json,rest,model-validation,C#,Json,Rest,Model Validation,我在C#WebAPI中有这个请求模型 然后我有一个API控制器,它接收该模型作为它的请求主体(POST)。问题是,如果我为了测试目的运行一个否定的案例。我请求一些类似这样的json { "Code": "abcde" } 我的请求模型自动将其code值设置为0。0是一个有效值 有没有办法处理这个案子?所以我可以在控制器中处理之前返回一些警告/错误? 谢谢之所以得到0,是因为字符串不能映射到int,所以它只留下一个默认值(即零)。要验证用户输入,可

我在C#WebAPI中有这个请求模型

然后我有一个API控制器,它接收该模型作为它的请求主体(POST)。问题是,如果我为了测试目的运行一个否定的案例。我请求一些类似这样的json

{
    "Code": "abcde"
}
我的请求模型自动将其
code
值设置为0。0是一个有效值

有没有办法处理这个案子?所以我可以在控制器中处理之前返回一些警告/错误?
谢谢

之所以得到0,是因为字符串不能映射到int,所以它只留下一个默认值(即零)。要验证用户输入,可以使用属性

试着这样做:

public class RequestModel
{
    [Range(1, int.MaxValue, ErrorMessage = "*Your warning*")]
    public int Code { set; get; }
}
if(!ModelState.IsValid)
{
    // Return errors for example
}
else
{
    // Something else
}
在控制器中,您可以检查模型状态是否有效并正确响应。基本上,在控制器中方法的开头,您应该编写如下内容:

public class RequestModel
{
    [Range(1, int.MaxValue, ErrorMessage = "*Your warning*")]
    public int Code { set; get; }
}
if(!ModelState.IsValid)
{
    // Return errors for example
}
else
{
    // Something else
}
有一种更优雅的方法来进行这种验证。您只需将字段设置为空(
int?
),并将所有验证工作委托给。它将在您进入控制器之前运行验证,并在出现问题时自动返回BADDREQUEST。模型的fluent验证器示例:

public class RequestModelValidator : AbstractValidator<RequestModel>
{
    public RequestModelValidator()
    {
        RuleFor(m => m.Code).NotNull().WithMessage("*Your msg*");
    }
}
公共类RequestModelValidator:AbstractValidator
{
公共RequestModelValidator()
{
RuleFor(m=>m.Code).NotNull().WithMessage(“*您的消息*”);
}
}

之所以得到0,是因为字符串无法映射到int,所以它只留下一个默认值(即零)。要验证用户输入,可以使用属性

试着这样做:

public class RequestModel
{
    [Range(1, int.MaxValue, ErrorMessage = "*Your warning*")]
    public int Code { set; get; }
}
if(!ModelState.IsValid)
{
    // Return errors for example
}
else
{
    // Something else
}
在控制器中,您可以检查模型状态是否有效并正确响应。基本上,在控制器中方法的开头,您应该编写如下内容:

public class RequestModel
{
    [Range(1, int.MaxValue, ErrorMessage = "*Your warning*")]
    public int Code { set; get; }
}
if(!ModelState.IsValid)
{
    // Return errors for example
}
else
{
    // Something else
}
有一种更优雅的方法来进行这种验证。您只需将字段设置为空(
int?
),并将所有验证工作委托给。它将在您进入控制器之前运行验证,并在出现问题时自动返回BADDREQUEST。模型的fluent验证器示例:

public class RequestModelValidator : AbstractValidator<RequestModel>
{
    public RequestModelValidator()
    {
        RuleFor(m => m.Code).NotNull().WithMessage("*Your msg*");
    }
}
公共类RequestModelValidator:AbstractValidator
{
公共RequestModelValidator()
{
RuleFor(m=>m.Code).NotNull().WithMessage(“*您的消息*”);
}
}

将您的型号更改为:

公共类请求模型
{
[必需]
公共int?代码{set;get;}
}

当接收到无法解析的值时,
code
将默认为null。如果您执行模型验证,它将确保
code
不为空。

将您的模型更改为:

公共类请求模型
{
[必需]
公共int?代码{set;get;}
}

当接收到无法解析的值时,
code
将默认为null。如果您执行模型验证,它将确保
code
不为空。

如果您在一个属性中发送一个字符串,该属性自然会接收一个整数,那么完整的对象将在其控制器中到达空值,正如您所提到的,字符串不会转换为零

一个实际例子:

类别模型:

public class RequestModel
{
    public int Code { set; get; }
}
您的控制器:

using Microsoft.AspNetCore.Mvc;

public class Test: Controller
{
    [HttpPost("/test")]
    public IActionResult Test([FromBody] RequestModel requestModel)
    {
        if (requestModel == null)
        {
            return BadRequest("Invalid request");
        }
        return Ok(requestModel);
    }
}

如果您发送一个字符串,在一个应该自然接收整数的属性中,完整的对象将在其控制器中到达null,正如您所提到的,不会将字符串转换为零

一个实际例子:

类别模型:

public class RequestModel
{
    public int Code { set; get; }
}
您的控制器:

using Microsoft.AspNetCore.Mvc;

public class Test: Controller
{
    [HttpPost("/test")]
    public IActionResult Test([FromBody] RequestModel requestModel)
    {
        if (requestModel == null)
        {
            return BadRequest("Invalid request");
        }
        return Ok(requestModel);
    }
}

哦,是的,
Range
模型验证完成了这项工作。。Thanks@Neistow我认为FluentValidation不负责在验证失败时自动返回
BadRequest
。这应该是由控制器上方的
[ApiController]
属性引起的。虽然FluentValidation可能也有这方面的功能。哦,对了,
Range
模型验证可以完成这项工作。。Thanks@Neistow我认为FluentValidation不负责在验证失败时自动返回
BadRequest
。这应该是由控制器上方的
[ApiController]
属性引起的。虽然FluentValidation也有一个功能。