8 Stimmen

MVC.NET Millisekunden gehen bei der Verwendung von Html.hidden auf einer DateTime LastUpdated-Spalte für die Versionsverfolgung verloren

Die Frage in Kürze:

Wie tot tun ce in MVC.NET?

Frage in Langfassung:

Im versuchen, eine DateTime-Spalte in einer SQL-Tabelle für die Versionsverfolgung zu verwenden (dies an sich wird als eine Lösung zum erneuten Anhängen einer Linq2Sql-Datenklasse vorgeschlagen, nachdem durch eine editview für die Tabelle zurückgegeben)

Aber jetzt bekomme ich "Zeile nicht gefunden oder geändert'-Ausnahme. auf die ctx.submit:

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

wo ctx ist meine Linq Datentext, Termine meine Tabelle, und Termin das Termin-Objekt, das ich versuche, anhängen. Ich habe die Termintabelle wie vorgeschlagen eingerichtet aquí

Dieses Problem wurde auch von einem Leser des Lösungsvorschlags festgestellt. Er schlug vor ce als eine Lösung.

Problem hier ist im nicht mit Webforms, im mit MVC.NET. Also ich schätze, mit

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

die Eigenschaft LastUpdate ändert. Gibt es also eine Möglichkeit, sicherzustellen, dass ich das gleiche (oder zumindest gleich) DateTime-Objekt erhalten, wenn dies zurück in meine Update-Aktion übergeben wird?

Im mit dem vorgeschlagenen gettime() Trigger auf Update meiner Termine Tabelle. Dies speichert offensichtlich ein Sql Datetime-Objekt. die möglicherweise nicht genau von Linq2SQL geparst werden. Ich vermute, dass dies auch zu dem Problem beiträgt.

Ich hoffe, es gibt eine Lösung für dieses Problem. Ich weiß, nur mit dem Zeitstempel-Format würde es auch lösen aber das ist außerhalb des Anwendungsbereichs dieser Frage

5voto

Alconja Punkte 14686

Ich denke, das Problem ist, dass das Schreiben aus der letzten Update-Zeit in ein verstecktes Feld wie das wird nur tun, eine ToString auf das Datum, das standardmäßig nicht die Millisekunden ausgeben wird. Sie könnten versuchen, den Zeitstempel als einen absoluten Wert wie Ticks zu rendern:

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

Sie können dann Ihre Datetime auf der anderen Seite rekonstruieren, indem Sie den Wert zurück in einen Long-Wert konvertieren und die DateTime rekonstruieren:

var dt = new DateTime(Int64.Parse(ticks));

4voto

jorge Punkte 41

Sie werden mir nicht glauben, aber probieren Sie es aus: Machen Sie vor der Rückkehr Ihres Controllers eine

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

Grund, jemand auf unendliches Vertrauen entscheiden Html.Hidden würde "posted"-Werte zu verwerfen Änderungen. Auch wenn auf c# auf der gleichen Seite erstellt.

Auf diese einfache Weise löschen Sie es aus dem ModelState, so dass es den neuen Wert auffängt, anstatt ihn zu posten.

Einige Leute sagen, dass das Standardverhalten richtig ist, aber bitte, ich habe mit einem handgefertigten Raster mit einer integrierten Unternehmenssuche (Unternehmen/Produkte) und einem versteckten Feld für den Schlüssel der Produkte (eine lange) gearbeitet. Ändern Sie das Unternehmen auf der gleichen Seite gebucht.

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

Ich habe so viele Stunden damit verbracht, herauszufinden, warum die falsche Firma aktualisiert wurde (die erste, die ich geladen habe). Weil es sich die erste Firma gemerkt und die Änderung, die ich in c# auf derselben Seite vorgenommen hatte, verworfen hat. Schwer zu fassen.

Schließlich musste ich dies tun:

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

Ich war so frustriert, dass ich beschloss, meine Abhilfe zu veröffentlichen...

Viel Glück!

4voto

Fordy Punkte 660

Wenn Sie Ticks nicht verwenden möchten, funktioniert TextBoxFor, wenn Sie das Datumsformat und das Attribut html hidden angeben.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })

2voto

Johann Strydom Punkte 1452

Sie müssen die Eigenschaft DateTime.Ticks verwenden, um die Millisekunden zu erhalten.

Wenn Sie ein ViewModel verwenden, können Sie eine Eigenschaft definieren, in der die DateTime-Ticks gespeichert werden. Zum Beispiel:

public long LastUpdateTick { get; set; }

Wenn Sie Ihre Entität auf Ihr Modell und zurück zuordnen, können Sie die Konvertierung zwischen DateTime und Ticks im Zuordnungscode vornehmen.

Ihre Ansicht kann dann mit der Eigenschaft LastUpdateTick verknüpft werden. Dadurch können Sie immer noch Lambda-Ausdrücke für die Bindung verwenden, wenn Sie dies wünschen.

1voto

Daniel Hume Punkte 437

Alternative Methode: Verwenden Sie keine Tag-Helfer-Methode, sondern schreiben Sie den Tag direkt in Ihre Seitenvorlage und fügen Sie den formatierten Wert ein, einschließlich ms:

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

Dies führt zu einer Ausgabe in der Form:

<input type="hidden" id="Created" name="Created" value="01/02/2019 13:09:46.927" />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X