Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 属性上的asp.net mvc3绑定排除无效_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 属性上的asp.net mvc3绑定排除无效

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

我有一个类,在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; 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控制器操作的参数,第二个将传递给视图。