Asp.net mvc ASP.NET MVC:如何保留字段字节[]

Asp.net mvc ASP.NET MVC:如何保留字段字节[],asp.net-mvc,data-binding,types,Asp.net Mvc,Data Binding,Types,我有一个字段,它的类型是byte[]。此字段将保存实体的RecordVersion属性(数据库中的时间戳)。如何保留此字段,以便在保存实体时它可用 我尝试了两种不同的方法,但迄今为止还没有成功: 这将呈现“System.Byte[]”: 显然,进行绑定/取消绑定的默认MVC机制不喜欢太多的byte[]字段……我不会在表单上添加时间戳。如果您想保留该对象,我会将其缓存到服务器端,并使用id从缓存中检索。否则,您可以从数据库中重新检索该对象,并应用表单数据中的更改。后者就是我所做的,使用TryUpd

我有一个字段,它的类型是byte[]。此字段将保存实体的RecordVersion属性(数据库中的时间戳)。如何保留此字段,以便在保存实体时它可用

我尝试了两种不同的方法,但迄今为止还没有成功: 这将呈现“System.Byte[]”:


显然,进行绑定/取消绑定的默认MVC机制不喜欢太多的byte[]字段……

我不会在表单上添加时间戳。如果您想保留该对象,我会将其缓存到服务器端,并使用id从缓存中检索。否则,您可以从数据库中重新检索该对象,并应用表单数据中的更改。后者就是我所做的,使用TryUpdateModel

public ActionResult Update( int id )
{
     using (var context = new DataContext())
     {
         var model = context.Models.Where( m => m.ID == id ).Single();
         if (TryUpdateModel( model ))
         {
            ...
            context.SubmitChanges(); // wrapped in try/catch
            ...
         }
         else
         {
            ...
         }
     }
     return RedirectToAction( "Show", new { id = id } );
}
你试过了吗

<%= Html.Hidden("RecordVersion", System.Text.Encoding.Unicode.GetString(Model.RecordVersion)) %>

您需要制作一个modelbinder并注册它

这显示了如何在隐藏字段中使用linq数据库中的时间戳,非常类似于您正在做的事情

 ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder()); 
在global.asax中注册它


该LinqBinaryModelBinder位于futures程序集中。如果你想使用byte[],你必须自己写一个。

@tvanfosson-这是一个很好的方法,我知道这显然是最常见的重放更改的方法。我只是想在表单中保留对象的Id和RecordVersion,这样我就可以使用自己的框架来回复更改(即,我不需要重新查询实体…),它似乎在表单中呈现了一个字符串,但在返回的过程中,它仍然没有转换回字节[]..您可以在modelbinder中使用Encoding.Unicode.GetBytes将其转换回字节数组。最安全的方法可能是将字节[]表示为base64字符串。与ModelBinders.Binders.Add(typeof(Binary),new LinqBinaryModelBinder()配合使用效果很好;谢谢
<%= Html.Hidden("RecordVersion", System.Text.Encoding.Unicode.GetString(Model.RecordVersion)) %>
 ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder());