Я пишу приложение ASP.NET ( C # код , MySQL бэкэнд), которое собирает пользовательские данные через форму для вставки в таблицу SQL с помощью хранимой процедуры.
Я использую и хочу использовать DataSources
так долго, как могу.
Поле формы, которое генерирует ошибку , является следующим TextBox
(или любым другим TextBox
, связанным с десятичным значением, присутствующим в этой форме):
<asp:TableCell>
<asp:TextBox ID="_txtImportoIVA" ClientIDMode="Static" TextMode="Number" Step="0.01" Width="120px" runat="server" /> €
</asp:TableCell>
Это значение подает следующий тогетер DataSource
со значениями из похожих виджетов:
<asp:SqlDataSource
runat="server"
ID="_sdsDocumentiContabili"
ConnectionString="<%$ ConnectionStrings:sos_db %>"
ProviderName="<%$ ConnectionStrings:sos_db.ProviderName %>"
InsertCommandType="StoredProcedure"
InsertCommand="create_ndc_nlt"
OnInserted="_sdsDocumentiContabili_Inserted" OnInserting="_sdsDocumentiContabili_Inserting">
<InsertParameters>
<asp:ControlParameter ControlID="_txtImportoIVA" PropertyName="Text" Name="_importo_iva" Type="Double" />
<asp:Parameter Name="_id_ndc" Type="Int32" Direction="Output" />
</InsertParameters>
</asp:SqlDataSource>
При запуске команды Insert
параметр:
<asp:ControlParameter ControlID="_txtImportoIVA" PropertyName="Text" Name="_importo_iva" Type="Double" />
подается со значением, которое корректно * только 1023 * , если текст внутри соответствующего TextBox
является целым числом. Когда я предоставляю десятичное значение (используя итальянская локализация), значение явно интерпретируется как целое число, потому что, я думаю, десятичный разделитель не распознается. Я попытался исправить это, изменив локализацию формы с учетом специфических параметров культуры в директиве Page
:
<%@ Page MasterPageFile="~/MasterPage.master" Language="C#" AutoEventWireup="true" CodeFile="NotaDiCreditoNLT.aspx.cs" Inherits="Intranet.NotaDiCreditoNLT" UICulture="it" Culture="it-IT" %>
Но результат не изменился, и значение по-прежнему неверно истолковывается.
Обратите внимание, что TextBox
заполняется через код javascript, а не при прямом вводе пользователем (как описано ниже):
var _totaleIVA = Math.round(100 * _totaleIE * g_faliquotaiva) / 100;
var _txtImportoIVA = document.getElementById('_txtImportoIVA');
_txtImportoIVA.value = _totaleIVA;
первая строка - небольшой обходной путь для усечения десятичной дроби до второй цифры, но ее можно опустить (форма все равно не будет работать).
Javascript
обработка данных в этой форме потребовала также небольшого обхода кода, потому что я хотел бы, чтобы некоторые TextBoxes
были readonly (удаление этого кода также не исправит эту проблему):
// Workaround to use readonly javascript modified textboxes
private void SetAttributes()
{
_txtImportoIVA.Attributes.Add("readonly", "readonly");
}
protected void Page_Load(object sender, EventArgs e)
{
SetAttributes();
}
Единственный способ, который я смог найти, чтобы преодолеть эту проблему, - это обработать код за переводом текста в двойной (это именно то, чего я пытался избежать):
protected void _sdsDocumentiContabili_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["_importo_iva"].Value = Double.Parse(_txtImportoIVA.Text, CultureInfo.InvariantCulture);
}
Конечно, для этого требуется, чтобы <asp:ControlParameter />
был понижен до тривиального <asp:Parameter />
:
<asp:Parameter Name="_importo_iva" Type="Double" Direction="Input"/>
Есть ли способ, позволяющий моей форме правильно обрабатывать десятичные данные без кода?