views:

96

answers:

1

i have my auto-generated linq to sql classes, and i extend this class using partial classing (instead of using inheritance), and i have properties that that i've put in later which are not part of the database model and should not be. these are things like "FinalPrice" and "DisplayFinalPrice" - in the dbase, there is only RetailPrice and WholesalePrice so FinalPrice etc are more like extensions of the dbase fields.

when i submit the form with nothing filled in, "FinalPrice" gets called (the 'get' of the property) even tho i never ask for it to be, and even tho it is not needed. this happens before validation, so i don't even get the validation errors i would get.

i've tried using and on the FinalPrice and FinalPriceDisplay properties - no go! why does this happen and how can i stop it from happening? is the modelstate just trying to validate everything so therefore it calls every item no matter what?

for those interested, here is all the code...

Partial Public Class tProduct 'Inherits tProduct Private Const CommissionMultiplier As Decimal = CDec(1.18) Private _FinalPrice As Decimal? Private _DisplayFinalPrice As String Private _DisplayNormalPrice As String

Public Property CategoryComplete As Short

<ScaffoldColumn(False)>
Public ReadOnly Property FinalPrice As Decimal
    Get
        'If RetailPrice IsNot Nothing OrElse WholesalePrice IsNot Nothing Then
        If _FinalPrice Is Nothing Then
            If RetailPrice IsNot Nothing Then
                _FinalPrice = RetailPrice
            Else
                _FinalPrice = WholesalePrice * CommissionMultiplier ' TODO: this should be rounded to the nearest 5th cent so prices don't look weird.
            End If

            Dim NormalPart = Decimal.Floor(_FinalPrice.Value)
            Dim DecimalPart = _FinalPrice.Value - NormalPart

            If DecimalPart = 0 OrElse DecimalPart = 0.5 Then
                Return _FinalPrice

            ElseIf DecimalPart > 0 AndAlso DecimalPart < 0.5 Then
                DecimalPart = 0.5   ' always rounded up to the nearest 50 cents.
            ElseIf DecimalPart > 0.5 AndAlso DecimalPart < 1 Then
                ' Only in this case round down if its about to be rounded up to a valeu like 20, 30 or 50 etc as we want most prices to end in 9.
                If NormalPart.ToString.LastChr.ToInt = 9 Then
                    DecimalPart = 0.5
                Else
                    DecimalPart = 1
                End If
            End If

            _FinalPrice = NormalPart + DecimalPart
        End If

        Return _FinalPrice
        'End If

    End Get
End Property

<ScaffoldColumn(False)>
Public ReadOnly Property DisplayFinalPrice As String
    Get

        If _DisplayFinalPrice.IsNullOrEmpty Then
            _DisplayFinalPrice = FormatCurrency(FinalPrice, 2, TriState.True)
        End If

        Return _DisplayFinalPrice
    End Get
End Property

Public ReadOnly Property DisplayNormalPrice As String
    Get
        If _DisplayNormalPrice.IsNullOrEmpty Then
            _DisplayNormalPrice = FormatCurrency(NormalPrice, 2, TriState.True)
        End If

        Return _DisplayNormalPrice

    End Get
End Property

Public ReadOnly Property DivID As String
    Get
            Return "pdiv" & ProductID
        End Get
    End Property


End Class

more...

i get busted here, with a null reference exception telling me it should contain a value...

                Dim NormalPart = Decimal.Floor(_FinalPrice.Value)

i can get rid of the problem, by just wrapping the commented out if statement in the code, but this shouldnt be called to begin with, and that's the issue im having.

+1  A: 

It looks like you are experiencing this problem (may be same issue?):

http://stackoverflow.com/questions/2211829/why-does-asp-net-mvc-care-about-my-read-only-properties-during-databinding

AJ