【发布时间】:2016-08-31 22:19:14
【问题描述】:
我正在尝试了解解决我的问题的最佳方法。假设我有一个这样的模型:
public class Customer
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
[Required]
public int StoreId { get; set;}
[Required]
public DateTime UpdatedAt {get; set;}
}
我有一个 API 控制器,它有如下方法在数据库中插入新客户:
public IHttpActionResult Insert(Customer customer)
{
customer.StoreId = 5; //just for example
customer.UpdatedAt = DateTime.Now; //again, just as example
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Customers.Add(customer);
db.SaveChanges();
return Ok(customer.Id);
}
现在您可以在方法中看到,假设 StoreId 和 UpdatedAt 字段不会包含在发布到此方法的原始 http 请求中,因为这些值需要在服务器端(假设基本上客户端不应该将这些值发送到服务器端方法)。在这种情况下,ModelState 将不再有效,因为它缺少两个必填字段。
您可以绕过它的一种方法是通过执行以下操作逐个清除模型状态上的错误:
ModelState["Store.Id"].Errors.Clear();
ModelState["UpdatedBy"].Errors.Clear();
然后进行验证,但这看起来不是一个好方法,特别是如果您有许多需要在服务器端处理的字段。
什么是更好的解决方案?
【问题讨论】:
-
模型有效。如果您没有为
StoreId和UpdatedAt传递任何值,那么它们将被初始化为其默认值(0和1/1/0001)。它可能无效的唯一方法是您专门为它们发送null值。您应该使用不包含这些属性的视图模型。除非您想指定特定的错误消息,否则添加[Required]属性是没有意义的 -int和DateTime不可为空,并且始终是必需的 -
您可以在
view中设置所需的值或参考值,然后将其发送到控制器,这样模型将始终有效。只有发送null才会无效
标签: asp.net-mvc entity-framework validation asp.net-web-api2 modelstate