2012-05-10 9 views
9
[Serializable] 
public class KeyValue : ProfileBase 
{ 
    public KeyValue() { } 

    public KeyValuePair<string, string> KV 
    { 
     get { return (KeyValuePair<string, string>)base["KV"]; } 
     set { base["KV"] = value; } 
    }    
} 

public void SaveProfileData() 
{ 
    KeyValue profile = (KeyValue) HttpContext.Current.Profile; 
    profile.Name.Add(File); 
    profile.KV = new KeyValuePair<string, string>("key", "val"); 
    profile.Save(); 
} 

public void LoadProfile() 
{ 
    KeyValue profile = (KeyValue) HttpContext.Current.Profile; 
    string k = profile.KV.Key; 
    string v = profile.KV.Value; 
    Files = profile.Name;   
} 

Próbuję zapisać KeyValuePair<K,V> w asp.net userprofile i to również zapisuje, ale kiedy mam do niego dostęp, pokazuje zarówno właściwość klucza i wartości zerowej, czy ktoś może mi powiedzieć, gdzie się mylę?Czy możemy zapisać KeyValuePair <K,V> w profilu użytkownika?

W LoadProfile() k i v są puste.

Web.config

<profile enabled="true" inherits="SiteBuilder.Models.KeyValue"> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    </providers> 
</profile> 
+0

Spróbowałbym nadać mu odrębną nazwę z twojej własności, tj. Zapisać i przeczytać '[" _KV "]" lub coś podobnego - nie mogę sobie wyobrazić, dlaczego to może coś zmienić, ale może to być serializacja. – Rup

+0

Nie mogę odtworzyć tego w nowym projekcie MVC3 (tzn. Działa poprawnie). Czy możesz podać kompletny przypadek testowy? W przeciwnym razie poleciłbym sprawdzić swój przepływ - być może w momencie, w którym wywołujesz LoadProfile(), nie ma on wartości. – georgiosd

Odpowiedz

0

Spróbuj umieścić [DataContract] i [DataMember] atrybuty klasy i mienia KeyValuePair. Będziesz musiał dodać odniesienie do System.Runtime.Serialization. Pamiętaj, że możesz również zastosować te atrybuty na poziomie klasy podstawowej, aby umożliwić serializację.

[DataContract] 
public class KeyValue : ProfileBase 
{ 
    public KeyValue() { } 

    [DataMember] 
    public KeyValuePair<string, string> KV 
    { 
     get { return (KeyValuePair<string, string>)base["KV"]; } 
     set { base["KV"] = value; } 
    }    
} 
2

C# 's KeyValuePair nie ma seter publiczna na klucz/wartość atrybutów. Więc może serializować, ale deserializuje puste.

Musisz stworzyć swoją własną, małą implementację klasy, na przykład:

[Serializable] 
[DataContract] 
public class KeyValue<K,V> 
{ 
    /// <summary> 
    /// The Key 
    /// </summary> 
    [DataMember] 
    public K Key { get; set; } 

    /// <summary> 
    /// The Value 
    /// </summary> 
    [DataMember] 
    public V Value { get; set; } 
} 

a następnie używać go w swoim przykładzie.