ASP.NET MVC: работа с полем Version - PullRequest
1 голос
/ 14 июня 2009

У меня версионная модель:

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

Отображается с использованием

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

дает:

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

это выглядит немного странно. В любом случае, когда форма отправлена, поле Версия всегда будет пустым.

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

Как я могу передать версию по проводу?

EDIT:

Наивное решение:

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

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

Ответы [ 6 ]

1 голос
/ 14 июня 2009

Похожие сообщения я нашел.

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

Предлагает превратить «двоичную версию» в «байтовую [] версию», но некоторые комментаторы заметили:

Проблема с этим подходом заключается в том, что это не работает, если вы хотите использовать 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" в строку так Вы можете сохранить его (например, в Интернете). страница). Когда LINQ to SQL получает метка времени из SQL Server, он хранит это в экземпляре двоичного класса. Так что вы по сути нужно конвертировать двоичный экземпляр в строку, а затем сможет преобразовать строку в эквивалент Двоичный экземпляр.

Код ниже предоставляет два расширения методы сделать это. Вы можете удалить «это» перед первым параметром, если вы предпочитаете, чтобы они были обычными статичными методы. Преобразование в базу 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));
}
1 голос
/ 14 июня 2009

Я думаю, что проблема с тем, что он не отображается в связанной модели при отправке формы, заключается в том, что нет никакого метода Convert.ToBinary (), доступного для двоичного файла модели, чтобы реструктурировать данные из строки в ее двоичное представление. Если вы хотите сделать это, я думаю, вам нужно будет конвертировать значение вручную. Я собираюсь догадаться, что значение, которое вы видите, представляет собой кодировку двоичного значения Base64 - вывод Binary.ToString (). В этом случае вам нужно преобразовать его обратно из Base64 в байтовый массив и передать его конструктору Binary () для восстановления значения.

Вы подумали о кэшировании объекта на стороне сервера? Это может быть немного сложнее, так как вам нужно отделить объект от контекста данных (я предполагаю, что LINQ), иначе вы не сможете присоединить его к другому контексту данных. Эта запись в блоге может быть полезна, если вы решите пойти по этому пути.

0 голосов
/ 19 апреля 2010

Есть много способов, как здесь

byte [] b = BitConverter.GetBytes (DateTime.Now.Ticks); // новый байт [(DateTime.Now) .Ticks]; _store.Version = новый System.Data.Linq.Binary (b)

(убедитесь, что привязка исключает вашу версию),

Но лучший способ - это позволить БД справиться с этим ...

0 голосов
/ 19 апреля 2010

Есть много способов, как здесь

byte [] b = BitConverter.GetBytes (DateTime.Now.Ticks); // новый байт [(DateTime.Now) .Ticks]; _store.Version = новый System.Data.Linq.Binary (b)

(убедитесь, что привязка исключает вашу версию),

Но лучший способ - это позволить БД справиться с этим ...

0 голосов
/ 16 июня 2009

Этот пост http://forums.asp.net/p/1401113/3032737.aspx#3032737 предлагает использовать LinqBinaryModelBinder от http://aspnet.codeplex.com/SourceControl/changeset/view/21528#338524.

После регистрации

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)

0 голосов
/ 14 июня 2009

Вам может понадобиться использовать привязку, чтобы получить строго типизированный параметр для вашего метода действия.

Попробуйте выполнить рендеринг, используя:

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

И определение вашей подписи метода действия как:

public ActionResult VersionedUpdate([Bind(Prefix="VersionModel")] VersionedModel data)
  {     
      ...
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...