我有一个类,它在DB中有8个属性/ 8列。在“编辑”页面中,我想要排除AddedDate和UserID字段。当用户编辑凭证时,他无法覆盖数据库中的AddedDate或UserID值。
public class Voucher
{
public int ID { get; set; }
public string Title { get; set; }
public string SiteName { get; set; }
public string DealURL { get; set; }
public DateTime AddedDate { get; set; }
public DateTime? ExpirationDate { get; set; }
public string VoucherFileURL { get; set; }
public Guid UserID { get; set; }
}
以下是编辑控制器的内容:
// POST: /Voucher/Edit/5
[HttpPost]
public ActionResult Edit([Bind(Exclude = "AddedDate")]Voucher voucher)
{
if (ModelState.IsValid)
{
db.Entry(voucher).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(voucher);
}
在编辑页面上,当我点击提交时,我收到以下错误:
System.Data.SqlServerCe.SqlCeException: An overflow occurred while converting to datetime.
似乎AddedDate没有从凭证对象中排除并触发错误。
请您告诉我如何修复它?谢谢!
(它是asp.net mvc3 UpdateModel exclude properties is not working的更新版本,我将采用另一种方法)
答案 0 :(得分:4)
永远不要将您的域实体用作操作参数,也不要将您的域实体传递给您的视图。我建议你使用视图模型。在视图模型中,您将仅包括要从视图绑定的属性。视图模型是专门根据给定视图的要求定制的类。
public class VoucherViewModel
{
public int ID { get; set; }
public string Title { get; set; }
public string SiteName { get; set; }
public string DealURL { get; set; }
public DateTime? ExpirationDate { get; set; }
public string VoucherFileURL { get; set; }
}
然后:
[HttpPost]
public ActionResult Edit(VoucherViewModel model)
{
// TODO: if the view model is valid map it to a model
// and pass the model to your DAL
// To ease the mapping between your models and view models
// you could use a tool such as AutoMapper: http://automapper.org/
...
}
更新:
在评论部分@ Rick.Anderson-at-Microsoft.com指出,虽然我已经回答了你的问题,但我没有解释问题的来源。
问题是DateTime
是一个值类型,意味着它总是有一个值。 [Bind(Exclude = "AddedDate")]
完全正常,它可以做它应该做的事情=>它不会绑定请求中的AddedDate
属性。因此,该属性将具有其默认值,对于DateTime字段为1/1/0001 12:00:00 AM
,当他尝试将其保存在SQL Server中时,它会因为SQL Server不支持这种格式而受到打击。