自定义验证-仅当放置方法时才需要

时间:2019-02-25 10:58:53

标签: c# .net rest api asp.net-web-api2

我有两个API端点,即发布和发布:

module.exports

DTO看起来像这样:

    [HttpPost]
    [Route("projects")]
    public IHttpActionResult Create([FromBody] ProjectDTO projectDto)
    {
        if (ModelState.IsValid)
        {
                var project = MappingConfig.Map<ProjectDTO, Project>(projectDto);
                _projectService.Create(project);

                return Ok("Project successfully created.");
        }
        else 
        { 
            return BadRequest(ModelState); 
        }
    }

    [HttpPut]
    [Route("projects")]
    public IHttpActionResult Edit([FromBody] ProjectDTO projectDto)
    {
        if (ModelState.IsValid)
        {
            var project = _projectService.GetById(projectDto.ProjectId);
            if (project == null)
                return NotFound();

            project = Mapper.Map(projectDto, project);
            _projectService.Update(project);

            return Ok("Project successfully edited.");
        }
        else 
        { 
            return BadRequest(ModelState); 
        }
    }

我正在尝试验证字段ProjectId。编辑实体时,仅在HttpPut方法中才需要ProjectId字段。

是否可以进行自定义验证RequiredIfPut或类似的事情,仅在编辑时才需要该字段,而在创建时则不需要?

2 个答案:

答案 0 :(得分:0)

这就是原因之一,为什么我在两种情况下都使用不同的类(例如ProjectUpdateRequestDtoProjectCreateRequestDto)。也许两者都可以从一个通用的基类派生而来,但是即使不是这样,也可以很容易地区分这两种情况。

安全性也可能是一个问题,因为如果您使用相同的类,则创建请求可能已经包含一个ID,并且如果您的create方法只是将DTO映射到数据库实体,则您可能会覆盖现有数据。这意味着您必须小心并考虑此类情况。如果您创建的DTO类不具有该属性,则不能在映射器中对其进行设置,也不能对其进行滥用。

答案 1 :(得分:0)

使用自定义验证属性,您可以执行以下操作:

class dataVerifier:
    data_list = []
    def __init__(self):
        print("Welcome...")

    def function1(self):
        print("I am in function 1")     

    def function2(self):
        print("I am in function 2")

    def function3(self):
        print("I am in function 3")

Obj = dataVerifier()

Obj.function1()

Obj.function2()

Obj.function3()

更新:

为回应您的评论,为了使解决方案更通用,您可以添加ParentDto类,从该类继承其他类,并且共享属性需要位于ParentDto类中,如下所示:

 public class RequiredWhenPutAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (System.Web.HttpContext.Current.Request.HttpMethod == "PUT")
            {
                var obj = (ProjectDTO)validationContext.ObjectInstance;
                if (obj.ProjectId == null)
                {
                    return new ValidationResult("Project Id is Required");
                }
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }

    public class ProjectDTO
    {
        [RequiredWhenPut]
        public int? ProjectId { get; set; }
    }