我有两个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或类似的事情,仅在编辑时才需要该字段,而在创建时则不需要?
答案 0 :(得分:0)
这就是原因之一,为什么我在两种情况下都使用不同的类(例如ProjectUpdateRequestDto
和ProjectCreateRequestDto
)。也许两者都可以从一个通用的基类派生而来,但是即使不是这样,也可以很容易地区分这两种情况。
安全性也可能是一个问题,因为如果您使用相同的类,则创建请求可能已经包含一个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; }
}