【问题标题】:ASP.NET MVC: How do I keep a field byte[]ASP.NET MVC:如何保留字段字节 []
【发布时间】:2009-03-21 14:44:21
【问题描述】:

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

我尝试了两种不同的方法,但到目前为止都没有成功: 这会呈现“System.Byte[]”:

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

这会引发类型无法转换的 ModelStateError:

ViewData["RecordVersion"] = entity.RecordVersion

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

【问题讨论】:

    标签: asp.net-mvc data-binding types


    【解决方案1】:

    你需要制作一个modelbinder并注册它。

    这个article 展示了如何在隐藏字段中使用来自 linq 数据库的时间戳,就像您正在做的那样。

     ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder()); 
    

    在 global.asax 中注册它。

    LinqBinaryModelBinder 在期货程序集中。如果你想使用 byte[],你必须自己写一个。

    【讨论】:

    • 最安全的做法可能是将 byte[] 表示为 base64 字符串。
    • 适用于 ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder());谢谢。
    【解决方案2】:

    你试过了吗?

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

    【讨论】:

    • 它似乎在表单中呈现了一个字符串,但在返回的路上它仍然没有转换回一个字节[] ....
    • 您可以在modelbinder 中使用Encoding.Unicode.GetBytes 将其转换回字节数组。
    【解决方案3】:

    我不会在表单上加上时间戳。如果你想保留对象,我会在服务器端缓存它并使用 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 } );
    }
    

    【讨论】:

    • @tvanfosson - 这是一个不错的方法,我知道这显然是重播更改的最常用方法。我只是想将对象的 Id 和 RecordVersion 保留在我的表单中,以便我可以使用自己的框架来回复更改(即我不需要重新查询实体......)
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2022-01-15
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多