Я заменил блок кода на своем веб-сайте пользовательским элементом управления. Исходный код и новый элемент управления вычисляют значение, но с помощью немного других средств; это не всегда требуется.
Когда новый элемент управления добавляется на страницу и не используется, кнопка «Далее» родительской страницы прокручивает браузер до верхней части страницы, но никогда не выполняет пост назад, насколько я могу судить по точкам останова. Если используется элемент управления, то есть нажата кнопка «Рассчитать», кнопка «Далее» работает как задумано. Если я удаляю элемент со страницы, кнопка «Далее» работает как положено.
Используя инструменты разработчика, я исследовал кнопку «Далее» до и после вычисления пользовательского контроля и не вижу никакой разницы.
Элемент управления используется на других страницах и выполняется без проблем, но в этом случае требуется вычисленное значение.
Что может привести к тому, что пользовательский элемент управления будет мешать кнопке на странице, на которой используется элемент управления?
Редактировать: Размещение запрошенного кода
код ascx
BikeGroupDropdowns - это пользовательский выпадающий список
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="SpringCalculator.ascx.vb" Inherits="RacetechSite4.SpringCalculator" %>
<%@ Register Src="~/UserControls/BikeGroupDropdown.ascx" TagName="BikeOption" TagPrefix="uc" %>
<table style="border-spacing:1em;">
<uc:BikeOption runat="server" ID="ridingType" GroupId="1" />
<uc:BikeOption runat="server" ID="age" GroupId="2" />
<uc:BikeOption runat="server" ID="skillLevel" GroupId="3" />
<uc:BikeOption runat="server" ID="stiffPref" GroupId="5" />
<uc:BikeOption runat="server" ID="height" GroupId="6" />
<uc:BikeOption runat="server" ID="gasTank" GroupId="7" />
<uc:BikeOption runat="server" ID="tireStiff" GroupId="8" />
<uc:BikeOption runat="server" ID="hfrSep" GroupId="10" />
<uc:BikeOption runat="server" ID="aarms" GroupId="11" />
<uc:BikeOption runat="server" ID="raceSport" GroupId="12" />
<uc:BikeOption runat="server" ID="frontRebSep" GroupId="13" />
<uc:BikeOption runat="server" ID="springConversion" GroupId="16" />
<tr>
<td>
<asp:Label runat="server" Width="125" Text="Rider Weight (without gear):" />
</td><td>
<asp:TextBox runat="server" ID="txtRiderWeight" Width="50"/>
<asp:RangeValidator runat="server" Type="Integer" MinimumValue="40" MaximumValue="500" ControlToValidate="txtRiderWeight" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtRiderWeight" ErrorMessage="Rider Weight Required">*</asp:RequiredFieldValidator>
<asp:RadioButtonList ID="rblWeightType" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow" CellPadding="5">
<asp:ListItem Text="lbs" Value="lbs" Selected="True" style="margin-right: 10px"></asp:ListItem>
<asp:ListItem Text="kg" Value="kg"></asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Label runat="server" ID="lblRiderWeightError" CssClass="ModifierErr" />
</td>
</tr>
<asp:Panel runat="server" ID="pnlBikeWeight" Visible="false">
<tr>
<td>
<label runat="server" text="Bike Weight (semi-wet):" />
</td><td>
<asp:TextBox runat="server" ID="txtBikeWeight" />
</td>
</tr>
</asp:Panel>
<tr></tr>
<tr>
<td colspan="2">
<h3 style="text-align:left;margin-top:15px">LOWERING</h3>
Leave blank unless you are lowering the vehicle.<br />
Flat Track is already lowered (leave blank).
</td>
</tr>
<tr>
<td>
<asp:Label runat="server" Width="125px" text="Fork Lowered Distance:"/>
</td><td>
<asp:TextBox runat="server" ID="txtFkLowDist" Width="50" />
<asp:RadioButtonList ID="rblFkDistType" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Text="in" Value="in" Selected="True" style="margin-right: 10px"></asp:ListItem>
<asp:ListItem Text="mm" Value="mm"></asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Label runat="server" ID="lblFkLowDistError" CssClass="ModifierErr"/>
</td>
</tr>
<tr>
<td>
<asp:Label runat="server" Width="125" Text="Shock Lowered Distance:" />
</td><td>
<asp:TextBox runat="server" ID="txtSkLowDist" Width="50" />
<asp:RadioButtonList ID="rblSkDistType" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Text="in" Value="in" Selected="True" style="margin-right: 10px"></asp:ListItem>
<asp:ListItem Text="mm" Value="mm"></asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr>
<td>
<asp:Label runat="server" ID="lblSkLowDistError" CssClass="ModifierErr" />
<br />
<asp:Label runat="server" ID="lblWeightTypeError" CssClass="ModifierErr" />
<br />
<asp:Label runat="server" ID="lblBikeWeightError" CssClass="ModifierErr" />
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Button runat="server" ID="btnCalculate" Text="Continue" OnClick="btnCalculate_Click" />
</td>
</tr>
<tr>
<td>
<asp:ValidationSummary runat="server" />
</td>
</tr>
<tr>
<td>
<asp:Label runat="server" ID="lblSpringCalcMsg"/><br />
<asp:Label runat="server" ID="lblFrontFormulaType" Visible="false" /><br />
<asp:Label runat="server" ID="lblRearFormulaType" Visible="false" />
<asp:Label runat="server" ID="lblBikeSize" Visible="false" />
</td>
</tr>
код ascx.vb
Public Class SpringCalculator
Inherits System.Web.UI.UserControl
'Getters and Setters removed for brevity
Public Property Bike As Vehicle
Public Property Genre As Integer
Public Property BikeId As Integer
Private Property Brand As String
Private Property Model As String
Private Property Yr As String
Public Property Oil As String
Public Property PressureSpring As String
Public Property Modifiers As String
Public Property FrontSpringRate As String
Public Property FrontStockRate As String
Public Property RearSpringRate As String
Public Property RearStockRate As String
Public Property FrontSelectedSpring As String
Public Property RearSelectedSpring As String
Public Property isFrontSpringAlternate As Boolean
Public Property isRearSpringAlternate As Boolean
Public Property FrontPreLoad As String
Public Property FrontPreLoadMm As Integer
Public Property FrontPreLoadLabel As String
Public Property RearPreLoad As String
Public Property RearPreLoadMm As Integer
Public Property RearPreLoadLabel As String
Public Property RiderWeightLbs As Decimal
Public Property BikeWeightLbs As Decimal
Public Property FrontLoweredMm As Decimal
Public Property RearLoweredMm As Decimal
Public Event Calculate As EventHandler
Private Const OneKGToLbFactor = 2.20462262
Private Const minLB = 31
Private Const maxLB = 499
Private minKG As Double = Math.Round(minLB / OneKGToLbFactor, 2)
Private maxKG As Double = Math.Round(maxLB / OneKGToLbFactor, 2)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
If Not RiderSettings.isValidString(Bike.ReturnValue("FSCS")) Then
springConversion.Visible = False
End If
If Not Bike.Type = Genres.ATV Then
aarms.Visible = False
raceSport.Visible = False
frontRebSep.Visible = False
End If
Brand = Bike.ReturnValue("Brand")
Model = Bike.ReturnValue("Model")
Yr = Bike.ReturnValue("Yr")
For Each c As Control In Controls
If c.GetType().ToString() = "ASP.usercontrols_bikegroupdropdown_ascx" And c.Visible Then
Dim uc As BikeGroupDropdown = c
assignBike(uc)
End If
Next
End If
End Sub
Private Sub assignBike(ByRef sender As BikeGroupDropdown)
sender.Brand = Brand
sender.Model = Model
sender.Year = Yr
End Sub
Private Function validateModifiers() As Boolean
Dim valid As Boolean = True
For Each c As Control In Controls
If c.GetType().ToString() = "ASP.usercontrols_bikegroupdropdown_ascx" And c.Visible Then
Dim myControl As BikeGroupDropdown = c
If myControl.VarId <= 0 Then
valid = False
End If
End If
Next
Return valid
End Function
Protected Sub btnCalculate_Click(sender As Object, e As EventArgs)
CalculateSprings()
RaiseEvent Calculate(sender, e)
End Sub
Public Sub CalculateSprings()
Dim valid As Boolean = True
If RiderWeightLbs = 0 Then
RiderWeightLbs = weightInLbs(txtRiderWeight.Text, rblWeightType.SelectedItem.Value)
End If
Try
BikeWeightLbs = weightInLbs(txtBikeWeight.Text, rblWeightType.SelectedItem.Value)
Catch ex As NullReferenceException
BikeWeightLbs = 0
End Try
Try
FrontLoweredMm = distInMm(txtFkLowDist.Text, rblFkDistType.SelectedItem.Value)
Catch ex As NullReferenceException
FrontLoweredMm = 0
End Try
Try
RearLoweredMm = distInMm(txtSkLowDist.Text, rblSkDistType.SelectedItem.Value)
Catch ex As Exception
RearLoweredMm = 0
End Try
Dim frontStockspringRate As String = ""
Dim frontRecSpringRate As String = ""
Dim rearStockspringRate As String = ""
Dim rearRecSpringRate As String = ""
Dim mods As String = ""
Try
lblSpringCalcMsg.Text = ""
Catch ex As NullReferenceException
'using as class not control
End Try
Dim Genre As String = CInt(Bike.Type)
Dim springCalc As SpringRateCalculator = New SpringRateCalculator("ConnectionString")
valid = (validateRideWeight())
If valid Then
'modifiers.Append(getModifiers()) 'Modifier numbers no longer printed
mods = getModifiers()
ViewState("Modifiers") = mods
If mods.Contains("87") Then
FrontLoweredMm = 0
RearLoweredMm = 0
End If
Dim pl = ""
'FORK
Try 'front preload
If Bike.Type = Genres.ATV Then
If mods.Contains("64") Then 'Sport
pl = Bike.ReturnValue("PL_S_F")
FrontPreLoad = String.Format("Preload {0}", pl)
FrontPreLoadLabel = "Preload"
ElseIf mods.Contains("65") Then 'Race
pl = Bike.ReturnValue("RaceGap_F")
FrontPreLoad = String.Format("Gap {0}", pl)
FrontPreLoadLabel = "Gap"
End If
Else
If mods.Contains("105") Then 'spring conversion
pl = Bike.ReturnValue("PL_Fscs")
Else
pl = Bike.ReturnValue("PL_F")
End If
FrontPreLoad = String.Format("Preload {0}", pl)
FrontPreLoadLabel = "Preload"
End If
Catch ex As Exception
pl = ""
Finally
If RiderSettings.isValidString(pl) Then
FrontPreLoad = FrontPreLoad + " mm"
FrontPreLoadMm = pl
End If
End Try
'spring rate
Try
frontRecSpringRate = String.Format("<tr><td class='RecSpringRate'>Recommended Front Spring Rate: </td><td><b>{0}</b> {1}</td></tr>", springCalc.CalcSpringRate(Brand, Model, Yr, "Front", mods, RiderWeightLbs, BikeWeightLbs, FrontLoweredMm).Replace(Environment.NewLine, ", "), springCalc.Note)
Catch ex As Exception
frontRecSpringRate = ex.Message
Finally
FrontSpringRate = frontRecSpringRate
End Try
frontStockspringRate = String.Format("<tr><td>Stock Front Spring Rate: </td><td><b>{0}</b> (stock)</td></tr>", springCalc.FrontStockRate(Bike))
FrontStockRate = frontStockspringRate
FrontSelectedSpring = springCalc.SelectedSpring
'SHOCK
Try 'rear preload
pl = ""
If Bike.Type = Genres.ATV And mods.Contains("65") Then 'Race
pl = Bike.ReturnValue("RaceGap")
RearPreLoad = String.Format("Gap {0}", pl)
RearPreLoadLabel = "Gap"
Else
pl = Bike.ReturnValue("PL_S")
RearPreLoad = String.Format("Preload {0}", pl)
RearPreLoadLabel = "Preload"
End If
Catch ex As Exception
pl = ""
Finally
If RiderSettings.isValidString(pl) Then
RearPreLoad = RearPreLoad + " mm"
RearPreLoadMm = pl
End If
End Try
'spring rate
Try
rearRecSpringRate = String.Format("<tr><td class='RecSpringRate'>Recommended Spring Rate: </td><td><b>{0}</b> {1}</td></tr>", springCalc.CalcSpringRate(Brand, Model, Yr, "Rear", mods, RiderWeightLbs, BikeWeightLbs, RearLoweredMm), springCalc.Note)
Catch ex As Exception
rearRecSpringRate = ex.Message
Finally
RearSpringRate = rearRecSpringRate
End Try
rearStockspringRate = String.Format("<tr><td>Stock Spring Rate: </td><td><b>{0}</b> (stock)</td></tr>", springCalc.RearStockRate(Bike))
RearStockRate = rearStockspringRate
RearSelectedSpring = springCalc.SelectedSpring
Dim pressureSpringExists = getPressureSpringSeries(Genre, Brand, Model, Yr)
If RiderSettings.isValidString(pressureSpringExists) Then
PressureSpring = "Spring Series " + getPressureSpringSeries(Genre, Brand, Model, Yr) + "; "
If mods.Split(",").Intersect("14,15,86".Split(",")).Any() Then 'Supercross; Arenacross; Freestyle MX
PressureSpring += "2.2 kg/mm"
ElseIf mods.Contains("11") Then 'Trail/Enduro
PressureSpring += "1.4 kg/mm"
ElseIf mods.Split(",").Intersect("12,13,54,55,85".Split(",")).Any() Then
PressureSpring += "1.8 kg/mm"
End If
End If
Oil = BikeSetting.Oil.Level(mods, True, Bike)
End If
End Sub
Private Function weightInLbs(ByVal weight As String, ByVal label As String) As Decimal
Dim rtn As Decimal
Decimal.TryParse(weight, rtn)
If label.ToLower = "kg" Then
rtn *= 2.20462262 '1 kilogram = 2.20462262 pounds
End If
Return rtn
End Function
Private Function distInMm(ByVal dist As String, ByVal label As String) As Decimal
Dim rtn As Decimal
Decimal.TryParse(dist, rtn)
If label.ToLower = "in" Then
rtn *= 25.4 '1 inch = 25.4 milimeters
End If
Return rtn
End Function
Private Function validateRideWeight() As Boolean
Dim valid As Boolean = True
Dim lbs As Double = -1
Try
lblRiderWeightError.Text = ""
lblWeightTypeError.Text = ""
Catch ex As NullReferenceException
Return True 'using as a class not control
End Try
If Not Helper.isDouble(RiderWeightLbs) Then
lblRiderWeightError.Text = "Enter a numeric value for Rider weight"
valid = False
Else
lbs = CDbl(RiderWeightLbs)
End If
If rblWeightType.SelectedIndex = -1 Then
lblWeightTypeError.Text = "Select Lbs or Kg for Weight type"
valid = False
Else
If lbs <> -1 Then
If rblWeightType.SelectedItem.Value.ToLower = "kg" Then
lbs = lbs * OneKGToLbFactor
End If
End If
If lbs < minLB Or lbs > maxLB Then
If rblWeightType.SelectedItem.Value.ToLower = "kg" Then
lblRiderWeightError.Text = "Weight must be between " & minKG & " and " & maxKG & " Kgs"
Else
lblRiderWeightError.Text = "Weight must be between " & minLB & " and " & maxLB & " Lbs"
End If
valid = False
End If
End If
Return valid
End Function
Private Function getModifiers() As String
Dim modifiers As New StringBuilder
For Each c As Control In Controls
If c.GetType().ToString() = "ASP.usercontrols_bikegroupdropdown_ascx" And c.Visible Then
Dim uc As BikeGroupDropdown = c
If modifiers.Length > 0 Then
modifiers.Append(",")
End If
modifiers.Append(uc.VarId)
End If
Next
Return modifiers.ToString()
End Function
Private Function getPressureSpringSeries(genre As Int32, brand As String, model As String, yr As String) As String
Dim series As String = ""
Try
If genre = 1 Then 'FRPS not found in Street Table, Quad is currently not surrported
series = Bike.ReturnValue("FRPS")
End If
Catch ex As Exception
Helper.SendError(String.Format("Session: {5}{4}{0} {4} brand:{1}\r\n model:{2}\r\n yr:{3}", ex.ToString, brand, model, yr, System.Environment.NewLine, Session.SessionID))
End Try
Return series
End Function
End Class