asp.net mvc3属性上的绑定排除不起作用

时间:2012-03-17 16:50:22

标签: asp.net-mvc

我有一个类,它在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的更新版本,我将采用另一种方法)

1 个答案:

答案 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不支持这种格式而受到打击。