...tänkte bara tillägga att jag nu ändå ändrade just denna Structure till en klass (innehållet är identiskt) och då funkar det perfekt...
...vilket ytterligare tyder på att det är en bugg...
2 svar · 268 visningar · startad av fredrik
Ok, det här blir inte helt lätt, men jag gör ett försök! :)
Jag har en Structure (Hotel) vilken innehåller en array av ännu en Structure (HotelRoom) som i sin tur innehåller en array av en 3.e structure (RoomName). Alltså 3 nestlade structures i varandra.
Detta funkar ju bra och så...men nu är det så att jag lägger den övergripande structure.n i ViewState och då händer något märkligt.
Det går fint att läsa in data i alla 3 nivåerna samt att tilldela viewstate värdet och sen ladda nästa sida (efter denna postback.en).
Men sen vid nästa postback som görs får jag felet:
"The viewstate is invalid for this page and might be corrupted"
...Så jag googlade fram till MS KB och hittade lite olika bla:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;829743
...och därigenom följde jag guiden för att debugga aspnet-processen för att få det "egentliga" felet. Det fick jag också och det löd:
"The ObjectManager found an invalid number of fixups. This usually indicates a problem in the Formatter."
Jaha...och så efter lite goolande efter det så tog det stopp...
Det går fint att spara "vanliga" värden i "nivå 2", men just en array verkar inte fungera. Jag har även provat med en vanlig Integer-array, men det går inte heller.
Om jag bortmarkerar koden för att lägga till i arrayen (både när den är av en "Structure"-typ och Integer) så funkar allt.
Alltså....kan detta vara någon slags bugg i asp.net? Dvs. nestlade structure-arrayer i 3 nivåer stödjs inte eller nåt?
Det känns nästan så, men man vet ju aldrig...
...idé, tankar eller annat?
(Ja, jag har läst att man ev. kan lösa problemet genom att använda klasser istället för Structures, men jag vill lösa problemet och så är det mindre overhead på structures när man serialiserar dessa).
Min kod ser förresten ut som följer:
Public Names() As HotelRoomName
Public Sub AddName(ByVal N As HotelRoomName)
If Names Is Nothing Then
ReDim Preserve Names(0)
Else
ReDim Preserve Names(Names.Length)
End If
Names(Names.Length - 1) = N
End Sub
<Serializable()> Public Structure HotelRoomName
Public Name As String
Public SurName As String
Public Sub New(ByVal _Name As String, ByVal _SurName As String)
Name = _Name
SurName = _SurName
End Sub
End Structure
Jag har exakt samma kod (fast med andra typer) vid "nivå 1" och där funkar det.
Tack på förhand!
...tänkte bara tillägga att jag nu ändå ändrade just denna Structure till en klass (innehållet är identiskt) och då funkar det perfekt...
...vilket ytterligare tyder på att det är en bugg...
Det är troligtvis en bugg så därför får du antingen komma runt det genom att använda Class istället alternativt bygga om det på annat lämpligt sätt.
http://www.dotnet247.com/247reference/msgs/24/120423.aspx skrev:
I can reproduce the problem at my side. I have a workaround that you can use Class instead of Sturct to fix this problem. I don't know why and think it could be a flaw.
[Serializable] public class /*struct*/ MyStruct
{
public string[] s;
}HTH.
--
Peter Wu
Microsoft Corporation
Ovanstående tyder ju på att felet borde vara rapporterat till Microsoft på ett lämpligt sätt. Men om det är en ren bugg - som det inte finns någon bättre workaround till än att använda class - tvivlar jag på att det är något de fixar innan 2.0.