Проблема обработки локализации десятичных чисел в ASP.NET - PullRequest
0 голосов
/ 27 марта 2019

Я пишу приложение 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" />&nbsp;&euro;
</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"/>

Есть ли способ, позволяющий моей форме правильно обрабатывать десятичные данные без кода?

...