RangeValidator на странице WebForms завершается ошибкой
Мне было поручено поддерживать старые веб-приложения без особой подготовки или опыта.
Меня попросили добавить новое поле в существующую таблицу и открыть его на веб-странице. Вот код для этого, который я смоделировал на других существующих полях и коде.
<asp:TextBox ID="PortableBarrelCompressionValuetextBox"
runat="server"
SkinID="FVTextBox"
Text='<%# Bind("PortableBarrelCompressionValue") %>'
<asp:RangeValidator
ID="RangeValidatorPortableBarrelCompressionValuetextBox"
runat="server"
ControlToValidate="PortableBarrelCompressionValuetextBox"
CssClass="failureNotification"
Display="Dynamic"
ErrorMessage="Whole Numbers Between 0 and 9999"
MaximumValue="9999"
MinimumValue="0"
Type="Integer"
Text='<%# Eval("PortableBarrelCompressionValue") %>'>
</asp:RangeValidator>
Это работает правильно только тогда, когда существующее значение не равно нулю (и, конечно, в пределах диапазона). Если я изменю действительное число, скажем, 22, на другое действительное число, 200, оно сохранит изменение, как и ожидалось.
Однако, если значение в существующей записи было нулевым, и я пытаюсь добавить целое число, произойдет сбой с сообщением об ошибке:
Value {" is not a valid value for Int32."} System.Exception
Также происходит сбой, если существует существующее, действительное значение, которое было удалено, с той же ошибкой.
Это поле не является обязательным, поэтому я должен разрешить использование пустых значений здесь.
За последние два дня я узнал достаточно, чтобы решить, что это происходит, потому что поле является целым числом и что Null не может быть преобразован в строку для проверки (по крайней мере, это то, что я предполагаю сейчас).
Если это правда, и это проблема, мне нужно найти способ решить эту проблему.
Я на правильном пути?
Есть ли способ обеспечить проверку, которая также будет принимать пустые значения в этом поле, в дополнение к целым числам в соответствующем диапазоне?
Заранее спасибо.
2 ответа
Это не бросает вашу ошибку
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="FredWebForm.WebForm1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<%--bind only used with controls that have datasource eg grid--%>
<asp:TextBox runat="server" Text='<%# GetStatus("PortableBarrelCompressionValue") %>' ID="MyTextBox" />
<asp:RangeValidator
ID="RangeValidatorPortableBarrelCompressionValuetextBox"
runat="server"
ControlToValidate="MyTextBox"
CssClass="failureNotification"
Display="Dynamic"
ErrorMessage="Whole Numbers Between 0 and 9999"
MaximumValue="9999"
MinimumValue="0"
Type="Integer"
Text='Needs to be a number between 0 and 9999'>
</asp:RangeValidator>
</asp:Content>
Код позади
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataBind();
}
}
protected string GetStatus(string theID)
{
return null;
}
}
Я наконец понял свою ошибку.
Этого не было в этом разделе вообще.
Я не осознавал, что определение LingDataSource для формы также необходимо обновить.
Как только я добавил эту строку:
<asp:Parameter Name="PortableBarrelCompressionValue"
ConvertEmptyStringToNull="true" />
Это вернулось к жизни.
Спасибо всем за поддержку.