MVC.NET миллисекунды теряются при использовании Html.hidden в столбце DateTime LastUpdated для отслеживания версии - PullRequest
6 голосов
/ 12 февраля 2010

Вопрос вкратце:

Как сделать это в MVC.NET?

Вопрос в длинной версии:

Я пытаюсь использовать столбец DateTime в таблице SQL для отслеживания версий (это само по себе предлагается в качестве решения для повторного присоединения класса данных Linq2Sql после его передачи в режиме редактирования для таблицы)

Но теперь я получаю исключение "строка не найдена или изменена". на ctx.submit:

 ctx.appointments.Attach(appointment,true);
 ctx.SubmitChanges();

где ctx - это мой текст данных Linq, назначения моей таблицы и назначение объекта встречи, который я пытаюсь прикрепить. Я настроил таблицу встреч как sugested здесь

Эта проблема также была отмечена читателем предлагаемого решения. Он предложил это в качестве решения.

Проблема в том, что я не использую webforms, я использую MVC.NET. Так что я предполагаю, используя

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

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

Я использую предложенный триггер gettime () при обновлении таблицы моих встреч. это очевидно хранит объект sql datetime. который не может быть точно проанализирован Linq2SQL. Я думаю, это также добавляет к проблеме.

Я надеюсь, что есть решение для этого. Я знаю, что только использование формата метки времени решит это также ... но это выходит за рамки этого вопроса

Ответы [ 5 ]

5 голосов
/ 12 февраля 2010

Я думаю, проблема в том, что запись последнего времени обновления в скрытое поле, подобное этому, просто сделает ToString в дату, которая по умолчанию не будет отображать миллисекунды. Вы можете попытаться отобразить временную метку в виде некоторого абсолютного значения, такого как тики:

<%= Html.Hidden("LastUpdate", Model.LastUpdate.Ticks) %>

Затем вы можете восстановить дату и время на другой стороне, преобразовав значение обратно в длинное и восстановив DateTime:

var dt = new DateTime(Int64.Parse(ticks));
4 голосов
/ 30 сентября 2014

Если вы не хотите использовать тики, TextBoxFor будет работать, если вы укажете формат даты и атрибут html hidden.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })
4 голосов
/ 15 февраля 2011

Вы не поверите мне, но попробуйте это: перед возвратом на свой контроллер, сделайте

ModelState.Remove("LastUpdate");
return View(model);

Причина в том, что кто-то на бесконечной уверенности решит, что Html.Hidden сохранит «опубликованные» значения, исключая изменения. Даже при создании на C # на той же странице.

Это простой способ удалить его из ModelState, чтобы он перехватывал новое значение вместо проведенного.

Некоторые люди считают поведение по умолчанию правильным, но, пожалуйста, я работал с сеткой ручной работы со встроенным поиском компании (компания / продукты) и скрытым полем для ключа продуктов (длинный). Смена компании размещена на той же странице.

<%= Html.Hidden("detalleProductos[" + i + "].PRO_PRODUCTOEMPRESAID", item.PRO_PRODUCTOEMPRESAID)%>
<%= Html.Hidden("detalleProductos[" + i + "].DET_DETALLEENCUESTAID", item.DET_DETALLEENCUESTAID)%>

Я потратил так много часов, пытаясь выяснить, ПОЧЕМУ он обновил не ту компанию (первое, что я загрузил). Потому что он вспомнил первый и отменил модификацию, которую я сделал на c # на той же странице. Трудно поймать.

Наконец я должен был сделать это:

foreach (var s in ModelState.Keys.ToList())
                if (s.StartsWith("detalleProductos"))
                    ModelState.Remove(s);

Я был так расстроен, что решил опубликовать мой обходной путь ...

Удачи!

1 голос
/ 04 февраля 2019

Альтернативный подход: вообще не использовать вспомогательный метод тега, просто запишите тег непосредственно в шаблон страницы и вставьте отформатированное значение, включая ms:

<input type="hidden" id="Created" name="Created" value="@Model.Created.ToString("dd/MM/yyyy HH:mm:ss.fff")" />

Будет отображаться вывод в виде:

<input type="hidden" id="Created" name="Created" value="01/02/2019 13:09:46.927" />
1 голос
/ 24 марта 2011

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

Если вы используете ViewModel, вы можете определить свойство для него, в котором будут храниться отметки DateTime. Например:

public long LastUpdateTick { get; set; }

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

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

...