在我的网络应用程序中,我有许多属性的课程。用户可以使用一组选择框修改这些属性,每个选择框负责一个属性。每次更改给定属性时,都会触发更改事件,并且ajax会将此属性的新值发送到Controller中的Update方法。
到目前为止,我有一个由可空字段组成的UpdateDto。在我的Update控制器中,我检查每个DTO的字段是否为空。如果它不为null,则表示用户想要更改此属性,并将其更新并保存在数据库中。
不幸的是,Update方法的代码对我来说有点难看。它检查每个属性,它很长。看看:
控制器中的更新方法:
public IHttpActionResult UpdateScrumTask(int id, ScrumTaskDetailsDto scrumTaskDto)
{
var scrumTaskFromDb = _context.ScrumTasks
.SingleOrDefault(s => s.Id == id);
if (scrumTaskFromDb == null)
return NotFound();
if (!ModelState.IsValid)
return BadRequest();
if (!string.IsNullOrWhiteSpace(scrumTaskDto.UserId))
{
var user = _context.Users
.SingleOrDefault(u => u.Id.Equals(scrumTaskDto.UserId));
scrumTaskFromDb.UserId = user?.Id;
}
else if (scrumTaskDto.EstimationId != null)
{
var estimation = _context.Estimations
.SingleOrDefault(u => u.Id == scrumTaskDto.EstimationId.Value);
scrumTaskFromDb.EstimationId = estimation?.Id;
}
else if (scrumTaskDto.Priority != null)
{
if (scrumTaskDto.Priority.Value == 0)
scrumTaskDto.Priority = null;
scrumTaskFromDb.Priority = scrumTaskDto.Priority;
}
else if (scrumTaskDto.TaskType != null)
{
scrumTaskFromDb.TaskType = scrumTaskDto.TaskType.Value;
}
_context.SaveChanges();
return Ok();
}
UpdateDTO:
public class ScrumTaskDetailsDto
{
public int? EstimationId { get; set; }
[Range(0, 5)]
public byte? Priority { get; set; }
[Range(0, 2)]
public TaskType? TaskType { get; set; }
public string UserId { get; set; }
}
请注意,这些属性在数据库中也可以为空。这就是为什么如果没有找到UserId,数据库中的属性被设置为null。
我想知道它应该是什么样的。什么是更好的解决方案
另一个问题是: 我应该在DTO中使用validtion(DataAnnotation)吗?如果没有,什么是替代解决方案?
答案 0 :(得分:2)
我建议进行一些改进: