Asp.net mvc 属性上的asp.net mvc3绑定排除无效
我有一个类,在DB中有8个属性/8列。在编辑页面中,我想排除addedate和UserID字段。当用户编辑凭证时,他不能覆盖数据库中的AddedDate或UserID值Asp.net mvc 属性上的asp.net mvc3绑定排除无效,asp.net-mvc,Asp.net Mvc,我有一个类,在DB中有8个属性/8列。在编辑页面中,我想排除addedate和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
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没有从凭证对象中排除并触发了错误
你能告诉我怎么修吗?谢谢
(这是的更新版本,我将采用另一种方法)永远不要将域实体用作操作参数,也不要将域实体传递给视图。我建议您使用视图模型。在视图模型中,您将仅包括要从视图绑定的特性。视图模型是专门为给定视图的需求定制的类
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不支持这种格式。切勿将域实体用作操作参数,也不得将域实体传递给视图。我建议您使用视图模型。在视图模型中,您将仅包括要从视图绑定的特性。视图模型是专门为给定视图的需求定制的类
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不支持这种格式。如果您担心安全问题,请不要直接绑定到您的实体。您如何知道错误不是来自ExpirationDate?如果您担心安全问题,请不要直接绑定到您的实体。您如何知道错误不是来自ExpirationDate?这是最好的答案,但仍然无法解释绑定排除失败的原因。我猜这不是他认为的日期时间。@Rick.Anderson-at-Microsoft.com,不是。这是因为dateTime
是一种值类型,意味着它总是有值的。[Bind(Exclude=“AddedDate”)]
工作得非常好,它完成了它应该做的事情=>它没有从请求绑定AddedDate属性。因此,该属性将具有默认值,即1/1/0001 12:00:00 AM
,当他尝试在SQL Server中保存此值时,它会崩溃,因为SQL Server不支持这种格式。谢谢你指出这一点。我已经更新了我的答案以包含此信息。谢谢更新。我无法编辑我的第一条评论以更改要删除的字体。如果我希望ViewModel中的某些属性,但不想更新它,我应该使用Bind Exclude吗?@Narayana,您可以有两个视图模型。一个没有属性,另一个从属性派生并添加属性。第一个将用作控制器后操作的参数,第二个将传递给视图。这是最好的答案,但仍然无法解释绑定排除失败的原因。我猜这不是他认为的日期时间。@Rick.Anderson-at-Microsoft.com,不是。这是因为dateTime
是一种值类型,意味着它总是有值的。[Bind(Exclude=“AddedDate”)]
工作得非常好,它完成了它应该做的事情=>它没有从请求绑定AddedDate属性。因此,该属性将具有默认值,即1/1/0001 12:00:00 AM
,当他尝试在SQL Server中保存此值时,它会崩溃,因为SQL Server不支持这种格式。谢谢你指出这一点。我已经更新了我的答案以包含此信息。谢谢更新。我无法编辑我的第一条评论以更改要删除的字体。如果我希望ViewModel中的某些属性,但不想更新它,我应该使用Bind Exclude吗?@Narayana,您可以有两个视图模型。一个没有属性,另一个从属性派生并添加属性。第一个将用作POST控制器操作的参数,第二个将传递给视图。