[vb.net] [asp.net 3.5] Waarde aanpassen in OnXXXChanged

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Ik ben begonnen met te spelen met Dynamic Data, en ontwikkel even tegen de Northwind database.
Het idee is dat als iemand een ShipAddress van een Order bewerkt, dit automagisch omgezet wordt naar uppercase. Daarvoor had ik de volgende code in gedachte:

Visual Basic .NET:
1
2
3
4
5
6
7
<MetadataType(GetType(OrderMetadata))> _
Partial Public Class Order

    Private Sub OnShipAddressChanged(ByVal value As String)
        value = value.ToUpper
    End Sub
End Class


Op google, www.asp.net e.d. kan ik genoeg voorbeelden vinden om de input te controleren en met
Visual Basic .NET:
1
Throw New ValidationException("binnengekomen:" & value)

Hiervan bericht terug te sturen naar de client. Maar de gegevens daadwerkelijk veranderen, lukt niet.

Als ik de private value Me._ShipAddress aanpas, krijg ik een foutmelding dat de row niet gevonden kan worden. Iemand een suggestie?

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Er is ook een OnShipAddressChanging. Deze wordt aangeroepen voordat linq de waarde is veranderd. In xxxChanging kun je de waarde wel aanpassen. Changing is voor validatie (en correcties), Changed is voor notificaties dat iets is veranderd.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Als ik de code verander in
Visual Basic .NET:
1
2
3
4
 Private Sub OnShipAddressChanging(ByVal value As String)
        Me._ShipAddress = value.ToUpper
        ' Throw New ValidationException("binnengekomen:" & value)
    End Sub

Krijg ik als melding
code:
1
Error: Sys.WebForms.PageRequestManagerServerErrorException: Row not found or changed.


Als ik de code verander in
Visual Basic .NET:
1
2
3
4
    Private Sub OnShipAddressChanging(ByVal value As String)
        value = value.ToUpper
        ' Throw New ValidationException("binnengekomen:" & value)
    End Sub

dan gebeurd er helemaal niets...

(Als ik het schoppen van een exceptie uit het commentaar haal, zie ik overigens wel dat de code aangeroepen wordt....)

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Sys.WebForms.PageRequestManagerServerErrorException: Row not found or changed.
Hoe krijg je in godsnaam een WEBFORMS exception bij het wijzigen van een Linq entity?

Het lijkt er meer op alsof je entity detached is. Tis erg lang geleden dat ik met L2S heb gespeelt, maar ik meen dat of de DataContext of de Tabel een Attach methode heeft waarmee je de entity weer 'bekend' kunt maken bij de data provider. Omdat je entity niet bekend is, weet linq ook niet welke wijzigingen (state tracking) je hebt gemaakt.

Maar is het niet eenvoudiger om de manipulaties gewoon in de set property zelf uit te voeren.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public string ShipAddress
{
    get { return _ShipAddress; }
    set 
    {
         OnShipAddressChanging(value);
         SendPropertyChanging("ShipAddress");

         value = value.ToUpper();  // <-- voer hier opschoon akties uit
         _ShipAddress = value;

         SendPropertyChanged("ShipAddress");
         OnShipAddressChanged();
    }
}

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
De
Visual Basic .NET:
1
Private Sub OnShipAddressChanging(ByVal value As String)
is een uitbreiding op de gegenereerde code uit Northwind.designer.vb
Visual Basic .NET:
1
Partial Private Sub OnShipAddressChanging(ByVal value As String) 

Dus de compiler gooit mijn code samen met de gegenereerde code.

Ik heb ook wat metadata toegevoegd, en die pakt hij ook op, dus het zou me sterk lijken dat hij detached is.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Imports Microsoft.VisualBasic
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(OrderMetadata))> _
Partial Public Class Order

    Private Sub OnShipAddressChanging(ByVal value As String)
        value = value.ToUpper
        ' Throw New ValidationException("binnengekomen:" & value)
    End Sub
End Class

Public Class OrderMetadata
    <UIHint("Date")> _
    <DisplayFormat(DataFormatString:="{0:d}")> _
    Public OrderDate As Object

    <UIHint("Date")> _
    <DisplayFormat(DataFormatString:="{0:d}")> _
    Public RequiredDate As Object

    <UIHint("Date")> _
    <DisplayFormat(DataFormatString:="{0:d}")> _
    Public ShippedDate As Object

    <DisplayFormat(DataFormatString:="{0:#0.0}")> _
    Public Freight As Object
End Class

Acties:
  • 0 Henk 'm!

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Schop?
Pagina: 1