Sql 在DateTime LastUpdated列上使用Html.hidden进行版本跟踪时,MVC.NET毫秒丢失

Sql 在DateTime LastUpdated列上使用Html.hidden进行版本跟踪时,MVC.NET毫秒丢失,sql,asp.net-mvc,datetime,versioning,Sql,Asp.net Mvc,Datetime,Versioning,简言之,问题是: 在MVC.NET中怎么做 问题全文: 我试图在SQL表中使用DateTime列进行版本跟踪(这本身就是一种解决方案,用于在被表的editview传回后重新附加Linq2Sql数据类) 但现在我得到“未找到或更改行”-异常。在ctx.submit上: ctx.appointments.Attach(appointment,true); ctx.SubmitChanges(); 其中,ctx是我的Linq数据上下文,约会是我的表,约会是我尝试附加的约会对象。。我已按建议设置约

简言之,问题是:

在MVC.NET中怎么做

问题全文:

我试图在SQL表中使用DateTime列进行版本跟踪(这本身就是一种解决方案,用于在被表的editview传回后重新附加Linq2Sql数据类)

但现在我得到“未找到或更改行”-异常。在ctx.submit上:

 ctx.appointments.Attach(appointment,true);
 ctx.SubmitChanges();
其中,ctx是我的Linq数据上下文,约会是我的表,约会是我尝试附加的约会对象。。我已按建议设置约会表

一位读者也注意到了这个问题。他提出了一个解决办法

这里的问题是我不使用webforms,我使用的是MVC.NET。所以我猜是用

            <%= Html.Hidden("LastUpdate", Model.LastUpdate) %>                

更改LastUpdate属性。 那么,有没有一种方法可以确保在将DateTime对象传递回update操作时获得相同(或至少相等)的DateTime对象

我在更新我的约会表时使用建议的gettime()触发器。这显然存储了一个SQLDateTime对象。Linq2SQL可能无法准确解析。我想这也增加了问题


我希望有一个解决办法。我知道使用时间戳格式也可以解决这个问题。。但这超出了这个问题的范围

我认为问题在于,将上次更新时间写入这样一个隐藏字段只会在默认情况下不会显示毫秒的日期执行
字符串。您可以尝试将时间戳呈现为某些绝对值,如刻度:

<%= Html.Hidden("LastUpdate", Model.LastUpdate.Ticks) %>

你不会相信我的,但是试试这个:在你的控制器返回之前,做一个测试

ModelState.Remove("LastUpdate");
return View(model);
原因是,有人在无限信心决定Html.Hidden将保持“张贴”值丢弃修改。即使是在同一页的c#上创建

<%= Html.Hidden("detalleProductos[" + i + "].PRO_PRODUCTOEMPRESAID", item.PRO_PRODUCTOEMPRESAID)%>
<%= Html.Hidden("detalleProductos[" + i + "].DET_DETALLEENCUESTAID", item.DET_DETALLEENCUESTAID)%>
这是一种从ModelState中删除它的简单方法,以便它捕获新值,而不是post

有些人说默认行为是正确的,但请注意,我使用的是一个手工制作的网格,带有集成的公司搜索(公司/产品)和隐藏的产品密钥字段(长)。更改发布在同一页面上的公司

<%= Html.Hidden("detalleProductos[" + i + "].PRO_PRODUCTOEMPRESAID", item.PRO_PRODUCTOEMPRESAID)%>
<%= Html.Hidden("detalleProductos[" + i + "].DET_DETALLEENCUESTAID", item.DET_DETALLEENCUESTAID)%>
我很沮丧,我决定发布我的解决方案


祝你好运

您需要使用DateTime.Ticks属性来获取毫秒数

如果使用的是ViewModel,则可以在其上定义存储日期时间刻度的属性。例如:

public long LastUpdateTick { get; set; }
将实体映射到模型并返回时,可以在映射代码中进行DateTime和记号之间的转换


然后,视图可以绑定到LastUpdateTick属性。如果愿意,这将允许您仍然使用lambda表达式进行绑定。

如果不想使用记号,则如果指定日期格式和html隐藏属性,TextBoxFor将起作用

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })

替代方法:根本不使用标记帮助器方法,只需将标记直接写入页面模板并插入格式化值,包括ms:

<input type="hidden" id="Created" name="Created" value="@Model.Created.ToString("dd/MM/yyyy HH:mm:ss.fff")" />

这将以以下形式呈现输出:

<input type="hidden" id="Created" name="Created" value="01/02/2019 13:09:46.927" />


如果将字符串解析回DateTime的代码期望的是MM/dd而不是dd/MM,那么像这样指定日期格式可能会很危险。结果可能是一个错误的日期值。@NineBerry这是一个很好的观点,这种方法对我来说很有效,因为我控制着从服务器上接收字符串的代码,而且我倾向于检查我控制的服务器在任何地方都使用英国日期/时间格式。但你指出的风险是对的,其他人可能更喜欢使用更便携的日期格式。
<input type="hidden" id="Created" name="Created" value="01/02/2019 13:09:46.927" />