我想了解什么是解决我问题的最佳方法。假设我有一个这样的模型:
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();
然后进行验证,但它看起来不是一个好方法,特别是如果你需要在服务器端处理许多字段。
有哪些更好的解决方案?
答案 0 :(得分:1)
好方法?创建特定于视图的视图模型,并且只具有视图应提供的属性。
public class CustomerVm
{
public int Id { get; set; }
public string Name { get; set; }
}
在您的GET操作中,将此对象发送到视图
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);
}