2009-06-14 11 views
1

J'ai un modèle versionné:ASP.NET MVC: traiter avec le champ Version

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

recomposés à l'aide

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

donne:

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

qui ressemble un peu étrange. De toute façon, lorsque le formulaire est soumis, le champ Version est toujours nul.

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

Comment puis-je transmettre la version sur le réseau?

EDIT:

Une solution naïve est:

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

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

Répondre

0

Ce poste http://forums.asp.net/p/1401113/3032737.aspx#3032737 suggère d'utiliser LinqBinaryModelBinder de http://aspnet.codeplex.com/SourceControl/changeset/view/21528#338524.

Une fois enregistré

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

le liant automatiquement désérialiser champ Version

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

rendu de cette façon:

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

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

0

Vous devrez peut-être utiliser la liaison pour obtenir un paramètre fortement typé à votre méthode d'action.

Essayez rendu en utilisant:

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

Et la définition de votre signature de la méthode d'action:

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

Je n'ai pas de problèmes avec d'autres propriétés du VersionModel, uniquement avec la propriété Version. Cela devrait être quelque chose de spécifique au type de données binaire. – alex2k8

1

Je pense que le problème de ne pas voir dans le modèle lié à la soumission du formulaire est qu'il n'y a Convert.ToBinary() méthode disponible pour le binaire de modèle pour restructurer les données d'une chaîne à sa représentation binaire. Si vous voulez faire cela, je pense que vous aurez besoin de convertir la valeur à la main. Je vais deviner que la valeur que vous voyez est le codage Base64 de la valeur binaire - la sortie de Binary.ToString(). Dans ce cas, vous devrez le convertir de Base64 en un tableau d'octets et le transmettre au constructeur Binary() pour reconstituer la valeur.

Avez-vous pensé à mettre en cache l'objet côté serveur à la place? Cela peut être un peu compliqué et vous devez détacher l'objet du contexte de données (je suppose que LINQ) ou vous ne seriez pas capable de le rattacher à un contexte de données différent. Ce blog entry peut vous être utile si vous décidez d'emprunter cette route.

+0

Merci pour vos idées, vous semblez voter pour ma "solution naïve". Selon la mise en cache côté serveur - je voudrais éviter cela. – alex2k8

1

Related posts J'ai trouvé.

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

suggère de transformer 'Version binaire' dans 'octet [] La version', mais certains commentateur remarqués:

Le problème avec cette approche est que il ne fonctionne pas si vous souhaitez utiliser la surcharge Table.Attach (modifié, original) , par exemple lorsque vous utilisez un contexte de données déconnecté .

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

propose une solution similaire à ma 'solution naïve'

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

Si vous utilisez ASP.Net et utilisez le SQL Server "timestamp" datatype pour concurrence, vous pouvez convertir la valeur "timestamp" dans une chaîne de sorte que vous pouvez le stocker (par exemple, sur une page Web ). Lorsque LINQ to SQL récupère un "horodatage" à partir de SQL Server, il stocke dans une instance de classe binaire. Donc, vous besoin essentiellement de convertir l'instance binaire en une chaîne et ensuite convertir la chaîne en équivalent instance binaire.

Le code ci-dessous fournit deux méthodes d'extension pour ce faire. Vous pouvez supprimer le "ceci" avant le premier paramètre si vous les préférez être des méthodes statiques ordinaires. La conversion à la base 64 est une précaution pour s'assurer que la chaîne résultante ne contient que caractères affichables et pas d'échappement caractères.

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

Il ya plusieurs façons comme ici

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

(assurez-vous liez exclure votre version),

Mais la meilleure façon est de laisser le DB manipuler ...

0

Il y a plusieurs façons comme ici

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

(assurez-vous liez exclure votre version),

Mais la meilleure façon est de laisser la DB manipuler ...