ASP.NET MVC:处理Version字段

时间:2009-06-14 11:39:59

标签: asp.net-mvc timestamp version

我有一个版本化的模型:

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

使用

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

它给出了:

<input id="Version" name="Version" type="hidden" value="&quot;AQID&quot;" />
看起来有点奇怪。无论如何,当提交表单时,Version字段始终为null。

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("\"", "")));
}

6 个答案:

答案 0 :(得分:1)

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

您是否考虑过缓存对象服务器端?这可能有点棘手,你必须从数据上下文中分离对象(我假设LINQ),否则你将无法将它重新连接到不同的数据上下文。如果您决定走这条路线,这blog entry可能会有所帮助。

答案 1 :(得分:1)

我发现的相关帖子。

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

建议将'二进制版'转换为'byte []版本',但有些评论者发现:

  

这种方法的问题在于   如果你想使用它,它不起作用   Table.Attach(修改,原创)   过载,例如当你使用的时候   断开连接的数据上下文。

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的“timestamp”,它存储   它在二进制类实例中。那么你   基本上需要转换Binary   实例到一个字符串,然后能够   将字符串转换为等效字符串   二进制实例。

     

以下代码提供了两个扩展名   这样做的方法。你可以删除   在第一个参数if之前的“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));
}

答案 2 :(得分:0)

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

尝试使用以下方式渲染:

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

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

public ActionResult VersionedUpdate([Bind(Prefix="VersionModel")] VersionedModel data)
  {     
      ...
  }

答案 3 :(得分: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());
}

活页夹将自动反序列化版本字段

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

答案 4 :(得分:0)

这里有很多方法

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

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

但最好的方法是让DB处理它......

答案 5 :(得分:0)

这里有很多方法

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

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

但最好的方法是让DB处理它......