【问题标题】:Adding values to model and passing trough ModelState vaidation向模型添加值并通过 ModelState 验证
【发布时间】: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);
}

现在您可以在方法中看到,假设 StoreIdUpdatedAt 字段不会包含在发布到此方法的原始 http 请求中,因为这些值需要在服务器端(假设基本上客户端不应该将这些值发送到服务器端方法)。在这种情况下,ModelState 将不再有效,因为它缺少两个必填字段。

您可以绕过它的一种方法是通过执行以下操作逐个清除模型状态上的错误:

 ModelState["Store.Id"].Errors.Clear();
 ModelState["UpdatedBy"].Errors.Clear();

然后进行验证,但这看起来不是一个好方法,特别是如果您有许多需要在服务器端处理的字段。

什么是更好的解决方案?

【问题讨论】:

  • 模型有效。如果您没有为StoreIdUpdatedAt 传递任何值,那么它们将被初始化为其默认值(01/1/0001)。它可能无效的唯一方法是您专门为它们发送null 值。您应该使用不包含这些属性的视图模型。除非您想指定特定的错误消息,否则添加 [Required] 属性是没有意义的 - intDateTime 不可为空,并且始终是必需的
  • 您可以在view中设置所需的值或参考值,然后将其发送到控制器,这样模型将始终有效。只有发送null才会无效

标签: asp.net-mvc entity-framework validation asp.net-web-api2 modelstate


【解决方案1】:

好方法?创建一个特定于视图的视图模型,并且只有视图应该提供的属性。

public class CustomerVm
{
   public int Id { get; set; }
   public string Name { get; set; }       
}

在您的 GET 操作中,将 this 的对象发送到视图

public ActionResult Edit(int id)  //Or even Create
{
  var vm=new CustomerVm { Id=id, Name="Scott to be edited"};
  return View(vm);
}

现在你的视图将被强类型化到这个

@model CustomerVm
@using(Html.BeginForm())
{
  @Html.HiddenFor(s=>s.Id)
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

在您的 HttpPost 操作中,使用与您的方法参数相同的视图模型,读取属性值并使用它

[HttpPost]
public ActionResult Create(CustomerVm model)
{
   var customerEntity = new Customer { Name= model.Name };
   //Stuff server should set goes now
   customerEntity.StoreId = 23;
   customerEntity.UpdatedAt = DateTime.Now;

   db.Customers.Add(customerEntity);
   db.SaveChanges();
   return Ok(customerEntity.Id);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2016-02-01
    • 2016-03-30
    相关资源
    最近更新 更多