0
Tags:
asp.net
Skrevet af
Bruger #7741
@ 09.08.2005
I de forrige lektioner har vi kigget på de mange forskellige typer af valideringskontroller. I denne lektion benytter vi nogle af kontrollerne til at udvide formularen fra lektion 9 til beregning af ydelse på et annuitetslån.
Formularen så således ud:
Figur 1 Formular til beregning af ydelse.For at være sikker på, at funktionen PMT(…) (se lektion 9) ikke kaldes med forkerte argumenter, kræver tre af kontrollerne på formularen validering:
[table][tr][td]
Kontrol[/td] [td]
Beskrivelse[/td][/tr][tr][td]
Rente[/td] [td]1. Der skal indtastes en værdi.
2. Renten skal være et decimaltal mellem 0 og 25.[/td][/tr][tr][td]
Antal terminer[/td] [td]1. Der skal indtastes en værdi.
2. Det skal være et heltal mellem 1 og 250.[/td][/tr][tr][td]
Hovedstol[/td] [td]1. Der skal indtastes en værdi.
2. Det skal være et decimaltal mellem 100 og 10.000.000,00[/td][/tr][/table]
Valideringen kan i dette tilfælde klares med tre RequiredFieldValidator-kontroller og tre RangeValidator-kontroller. For at gøre det så brugervenligt som muligt bruges der ligeledes en ValidationSummary-kontrol for at samle eventuelle fejlmeddelelser.
Her følger selve formularen med de syv valideringskontroller:
<html>
<body>
<form runat="server">
Rente:
<asp:TextBox id="Rate" runat="server"/>
<asp:requiredfieldvalidator id="val1" errormessage="Nominel rente
skal udfyldes." text="*" ControlToValidate="Rate" runat=server
display="dynamic" enableclientscript="false" />
<asp:rangevalidator id="val2" errormessage="Fejl i nominel rente."
text="*" ControlToValidate="Rate" type="double" minimumvalue="0"
maximumvalue="25" enableclientscript="false"
runat=server display="dynamic" />
<br />
Antal terminer:
<asp:TextBox id="NPer" runat="server"/>
<asp:requiredfieldvalidator id="val3" errormessage="Antal terminer
skal udfyldes." text="*" ControlToValidate="NPer" runat=server
display="dynamic" enableclientscript="false"/>
<asp:rangevalidator id="val4" errormessage="Fejl i antal terminer."
text="*" ControlToValidate="NPer" type="integer" minimumvalue="1"
maximumvalue="250" enableclientscript="false"
runat=server display="dynamic" />
<br />
Antal terminer pr. år:
<asp:DropDownList id="ATÅ" runat="server">
<asp:ListItem Value="1">
1 terminer/år
</asp:ListItem>
<asp:ListItem Value="4" Selected="True">
4 terminer/år
</asp:ListItem>
<asp:ListItem Value="12">
12 terminer/år
</asp:ListItem>
</asp:DropDownList>
<br />
Hovedstol:
<asp:TextBox id="PV" runat="server"/>
<asp:requiredfieldvalidator id="val5" errormessage="Hovedstol
skal udfyldes" text="*" ControlToValidate="PV" runat=server
display="dynamic" enableclientscript="false"/>
<asp:rangevalidator id="val6" errormessage="Fejl i hovedstol."
text="*" ControlToValidate="PV" type="double" minimumvalue="100"
maximumvalue="10000000" enableclientscript="false"
runat=server display="dynamic" />
<br />
Forfald:
<asp:RadioButton id="DueForud" runat="server"
GroupName="Due" Text="Forud"/>
<asp:RadioButton id="DueBagud" runat="server"
GroupName="Due" Text="Bagud" Checked="True"/>
<br />
<asp:Button id="Beregn" Onclick="Beregn_Click"
runat="server" Text="Beregn"/>
<br />
<br />
<asp:validationsummary id="valsum" runat=server />
<asp:Label id="Resultat" runat="server" />
</form>
</body>
</html>
Bemærk, at valideringskontrollerne er placeret lige efter de kontroller de skal validere, og at Text-egenskaben er "*". Eventuelle fejl vil således blot blive markeret med en stjerne, og selve fejlmeddelelsen opsamlet af ValidationSummary-kontrollen nederst på siden. Yderligere er Display-egenskaben tildelt værdien "Dynamic" hvilket betyder, at stjernen vil stå samme sted hvad enten det er RequiredFieldValidator- eller RangeValidator-kontrollen der ikke validerer korrekt (prøv at rette værdien til "Static", og se hvad der sker).
Som det fremgår, er alle valideringskontroller sat til at validere på serveren (EnableClientScript-egenskaben er False). Det kunne med fordel ændres til klientvalidering (kræver dog at browseren kan håndtere det), men for eksemplets skyld er servervalidering valgt i dette tilfælde.
Selve koden bag beregningen er ændret en lille smule - nemlig ved at kontrollere om alle kontroller er valide inden selve beregningen sker, ved hjælp af IsValid-egenskaben. Hvis det ikke er tilfældet, slettes den tekst som eventuelt måtte stå i Resultat-etiketten. Hvis det ikke blev gjort, kunne man risikere at der både var et resultat fra en tidligere beregning i Resultat-etiketten, og samtidigt en fejlmeddelelse fordi der er indtastet forkerte data i forbindelse med en ny beregning.
Her er den tilrettede kode:
<%@ Assembly Name="microsoft.visualbasic, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, Custom=null" %>
<%@ Page Language="C#" %>
<script runat="server">
void Beregn_Click(Object sender, EventArgs e)
{
if(Page.IsValid){
// Først indsamles og typekonverteres data så
// de kan bruges i kaldet til PMT-metoden
double lRate=Convert.ToDouble(Rate.Text) / 100;
// Tager hensyn til antal terminer pr år
lRate = lRate / Convert.ToDouble(ATÅ.SelectedItem.Value);
// NPer og PV
double lNPer=Convert.ToDouble(NPer.Text);
double lPV=Convert.ToDouble(PV.Text);
// Forud eller bagud
Microsoft.VisualBasic.DueDate lDue;
if(DueForud.Checked)
lDue = Microsoft.VisualBasic.DueDate.BegOfPeriod;
else
lDue = Microsoft.VisualBasic.DueDate.EndOfPeriod;
// FV sættes til 0
double lFV = 0;
// Beregn
double lResultat = Microsoft.VisualBasic.Financial.Pmt(lRate,
lNPer, -lPV, lFV, lDue);
// Skriv resultat
Resultat.Text = "Ydelsen er beregnet til " +
lResultat.ToString("N2");
}
else{
Resultat.Text = "";
}
}
</script>
<%@ Page Language="VB" %>
<script runat="server">
Sub Beregn_Click(sender As Object, e As EventArgs)
if Page.IsValid then
' Først indsamles og typekonverteres data så
' de kan bruges i kaldet til PMT-metoden
Dim lRate As Double =Convert.ToDouble(Rate.Text) / 100
' Tager hensyn til antal terminer pr år
lRate = lRate / Convert.ToDouble(ATÅ.SelectedItem.Value)
' NPer og PV
Dim lNPer As Double=Convert.ToDouble(NPer.Text)
Dim lPV As Double=Convert.ToDouble(PV.Text)
' Forud eller bagud
Dim lDue As Microsoft.VisualBasic.DueDate
if DueForud.Checked
lDue = Microsoft.VisualBasic.DueDate.BegOfPeriod
else
lDue = Microsoft.VisualBasic.DueDate.EndOfPeriod
End if
' FV sættes til 0
Dim lFV As Double = 0
' Beregn
Dim lResultat As Double = Microsoft.VisualBasic.Financial.Pmt( _
lRate, lNPer, -lPV, lFV, lDue)
' Skriv resultat
Resultat.Text = "Ydelsen er beregnet til " & _
lResultat.ToString("N2")
else
Resultat.Text = ""
end if
End Sub
</script>
For selv at prøve eksemplet skal du kombinere script-delen i det sprog du ønsker, øverst i dokumentet og opmærkningsdelen i samme dokument.
Slutteligt er her et par billeder af den "nye" formular:
Figur 2 Fejl i indtastningerne.Figur 3 Indtastningerne er korrekte, og beregningen kan udføres.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (0)
Du skal være
logget ind for at skrive en kommentar.