2009-06-14 11 views
1

Ich habe ein versioniert Modell:ASP.NET MVC: mit Version Feld Umgang

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

Rendered

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

mit es gibt:

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

, die ein bisschen seltsam aussieht. Beim Senden des Formulars ist das Feld Version immer auf Null gesetzt.

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

Wie kann ich Version über die Leitung übergeben?

EDIT:

Eine naive Lösung ist:

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

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

Antwort

0

Dieser Beitrag http://forums.asp.net/p/1401113/3032737.aspx#3032737 schlägt LinqBinaryModelBinder von http://aspnet.codeplex.com/SourceControl/changeset/view/21528#338524 zu verwenden.

registriert Sobald

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

das Bindemittel wird automatisch deserialisieren Feld Version

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

auf diese Weise gemacht:

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

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

0

Möglicherweise müssen Sie Bindung verwenden, um eine stark typisierte Parameter auf Ihre Aktion-Methode zu erhalten.

Try-Rendering:

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

Und Definition Ihrer Aktionsmethode Signatur als:

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

Ich habe keine Probleme mit anderen Eigenschaften des VersionModel, Nur mit Version-Eigenschaft. Es sollte eine bestimmte Sache für den Binär-Datentyp sein. – alex2k8

1

denke ich, das Problem mit dem nicht im gebundenen Modell auf Formulareinreichung zu sehen ist, dass es keine Die Convert.ToBinary() -Methode, die dem Modellbinär zur Verfügung steht, um die Daten von einem String in seine binäre Darstellung umzustrukturieren. Wenn Sie dies tun möchten, müssen Sie den Wert von Hand konvertieren. Ich gehe davon aus, dass der Wert, den Sie sehen, die Base64-Codierung des binären Werts ist - die Ausgabe von Binary.ToString(). In diesem Fall müssen Sie es zurück von Base64 in ein Byte-Array konvertieren und dieses an den Binary() -Konstruktor übergeben, um den Wert wiederherzustellen.

Haben Sie darüber nachgedacht, das Objekt serverseitig zu cachen? Dies könnte ein wenig schwierig sein, ebenso wie Sie das Objekt aus dem Datenkontext lösen müssen (ich nehme LINQ an), oder Sie wären nicht in der Lage, es wieder an einen anderen Datenkontext anzuhängen. Diese blog entry kann hilfreich sein, wenn Sie sich entscheiden, diese Route zu gehen.

+0

Vielen Dank für Ihre Ideen, scheinen Sie für meine "naive Lösung" zu stimmen. Nach serverseitigem Caching möchte ich das vermeiden. – alex2k8

1

Verwandte Beiträge, die ich gefunden habe.

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

Schlägt 'Binary Version' in 'byte [] Version' zu drehen, aber einige Kommentator bemerkte:

Das Problem bei diesem Ansatz ist, dass es nicht funktioniert Wenn Sie die Table.Attach (geändert, Original) Überladung verwenden möchten, wie wenn Sie einen getrennten Datenkontext verwenden.

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

schlägt eine Lösung ähnlich wie meine 'naive Lösung'

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

Wenn Sie ASP.Net verwenden, und verwenden Sie die SQL Server "timestamp" -Datentyp für Gleichzeitigkeit, möchten Sie möglicherweisekonvertierenden "timestamp" -Wert in eine Zeichenfolge so Sie können es speichern (z. B. auf einer Web Seite). Wenn LINQ to SQL einen "timestamp" von SQL Server abruft, speichert es es in einer Binary-Klasseninstanz. So müssen Sie im Wesentlichen die binäre Instanz in eine Zeichenfolge konvertieren und dann die Zeichenfolge in eine äquivalente Binary-Instanz konvertieren können.

Der folgende Code bietet zwei Erweiterungen Methoden, um dies zu tun. Sie können das "this" vor dem ersten Parameter entfernen, wenn Sie bevorzugen, dass sie gewöhnliche statische Methoden sind. Die Umwandlung in Base 64 ist eine Vorsichtsmaßnahme, um sicherzustellen, dass die resultierende Zeichenfolge enthält nur anzeigbare Zeichen und keine Escape Zeichen.

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)); 
} 
0

Es gibt viele Möglichkeiten wie hier

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

(stellen Sie sicher, dass Sie binden Ihre Version ausschließen),

Aber der beste Weg ist die DB damit umgehen zu lassen ...

0

Es gibt viele Möglichkeiten, wie hier

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

(stellen Sie sicher, dass Sie binden Ihre Version ausschließen),

Aber der beste Weg ist die DB damit umgehen zu lassen ...