1

我有一个版本模型:

public class VersionedModel
{
    public Binary Version { get; set; }
}

使用渲染

<%= Html.Hidden("Version") %>

它给:

<input id="Version" name="Version" type="hidden" value="&quot;AQID&quot;" />

看起来有点奇怪。无论如何,当表单提交时,Version 字段始终为空。

public ActionResult VersionedUpdate(VersionedModel data)
{ 
    ...
}

如何通过网络传递版本?

编辑:

一个天真的解决方案是:

public ActionResult VersionedUpdate(VersionedModel data)
{ 
    data.Version = GetBinaryValue("Version");
}

private Binary GetBinaryValue(string name)
{
    return new Binary(Convert.FromBase64String(this.Request[name].Replace("\"", "")));
}
4

6 回答 6

2

我找到的相关帖子。

1) http://geekswithblogs.net/frankw/archive/2008/08/29/serialization-issue-with-timestamp-in-linq-to-sql.aspx

建议将“二进制版本”转换为“字节 [] 版本”,但一些评论者注意到:

这种方法的问题在于,如果您想使用 Table.Attach(modified, original) 重载,例如当您使用断开连接的数据上下文时,它就不起作用。

2) http://geekswithblogs.net/AndrewSiemer/archive/2008/02/11/converting-a-system.data.linq.binary-or-timestamp-to-a-string-and-back.aspx

建议类似于我的“天真的解决方案”的解决方案

public static string TimestampToString(this System.Data.Linq.Binary binary) 
{ ... }

public static System.Data.Linq.Binary StringToTimestamp(this string s)
{ ... }

3) http://msdn.microsoft.com/en-us/library/system.data.linq.binary.aspx

如果您正在使用 ASP.Net 并使用 SQL Server“timestamp”数据类型进行并发,您可能希望将“timestamp”值转换为字符串以便可以存储它(例如,在网页上)。当 LINQ to SQL 从 SQL Server 检索“时间戳”时,它会将其存储在 Binary 类实例中。因此,您基本上需要将 Binary 实例转换为字符串,然后能够将字符串转换为等效的 Binary 实例。

下面的代码提供了两种扩展方法来做到这一点。如果您希望它们是普通的静态方法,您可以删除第一个参数之前的“this”。转换为 base 64 是一种预防措施,以确保生成的字符串仅包含可显示字符而没有转义字符。

public static string ConvertRowVersionToString(this Binary rowVersion) {
  return Convert.ToBase64String(rowVersion.ToArray());
}
public static Binary ConvertStringToRowVersion(this string rowVersion) {
  return new Binary(Convert.FromBase64String(rowVersion));
}
于 2009-06-14T17:43:51.067 回答
1

我认为在表单提交的绑定模型中看不到它的问题是模型二进制文件没有可用的 Convert.ToBinary() 方法来将数据从字符串重组为二进制表示。如果你想这样做,我认为你需要手动转换值。我猜你看到的值是二进制值的 Base64 编码——Binary.ToString() 的输出。在这种情况下,您需要将其从 Base64 转换回字节数组,并将其传递给 Binary() 构造函数以重构该值。

您是否考虑过在服务器端缓存对象?这可能有点棘手,因为您必须将对象从数据上下文中分离(我假设是 LINQ),否则您将无法将其重新附加到不同的数据上下文。如果您决定走这条路,此博客条目可能会有所帮助。

于 2009-06-14T12:37:59.070 回答
0

您可能需要使用绑定来为您的操作方法获取强类型参数。

尝试使用渲染:

  <%=Html.Hidden("VersionModel.Version")%>

并将您的操作方法签名定义为:

public ActionResult VersionedUpdate([Bind(Prefix="VersionModel")] VersionedModel data)
  {     
      ...
  }
于 2009-06-14T11:51:54.297 回答
0

这篇文章http://forums.asp.net/p/1401113/3032737.aspx#3032737建议使用来自http://aspnet.codeplex.com/SourceControl/changeset/view/21528#338524的 LinqBinaryModelBinder 。

一旦注册

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder());
}

binder 将自动反序列化 Version 字段

public ActionResult VersionedUpdate(VersionedModel data) 
{ ... }

以这种方式呈现:

<%= Html.Hidden("Version") %>

(另见http://stephenwalther.com/blog/archive/2009/02/25/asp.net-mvc-tip-49-use-the-linqbinarymodelbinder-in-your.aspx

于 2009-06-15T20:17:51.687 回答
0

有很多方法像这里

byte[] b = BitConverter.GetBytes(DateTime.Now.Ticks);//新字节[(DateTime.Now).Ticks]; _store.Version = 新 System.Data.Linq.Binary(b)

(确保您绑定排除您的版本),

但最好的方法是让数据库处理它......

于 2010-04-19T11:33:09.740 回答
0

有很多方法像这里

byte[] b = BitConverter.GetBytes(DateTime.Now.Ticks);//新字节[(DateTime.Now).Ticks]; _store.Version = 新 System.Data.Linq.Binary(b)

(确保您绑定排除您的版本),

但最好的方法是让数据库处理它......

于 2010-04-19T11:41:37.227 回答