FormCollection MVC5 не передает десятичную в контроллер - PullRequest
0 голосов
/ 22 марта 2019

Я получаю ошибки при попытке отправить <input type="number"> из моего обзора на мой контроллер с помощью FormCollection.Тип базы данных для CostBackup - decimal(8,2).Я продолжаю получать "Cannot impliticity convert string to decimal?". Затем, когда я пытаюсь expenseBackup = Int32.Parse(formValues["expenseBackup"]), я получаю "Input string was not in correct format".я не хочу преобразовывать что-либо в контроллере, я не понимаю, почему он не будет просто проходить через десятичное число через FormCollection.

Контроллер

 [HttpPost]
        public ActionResult Create(FormCollection formValues)
        {
            var data = new usr_ebillingClientDatabase()
            {
                client = formValues["client"], //is a string from form
                expenseBackup = formValues["expenseBackup"] //is a decimal from form
            };
            dataContext.table1.InsertOnSubmit(data);
            try
            {
                dataContext.SubmitChanges();                    
                return RedirectToAction("Index");
            }
            catch (Exception e)
            {
                return RedirectToAction("Index");
            }           
        }

Просмотр

<div class="form-group">
    <div class="col-md-10">
        @Html.EditorFor(model => model.expenseBackup, new { htmlAttributes = new { @class = "form-control" , , @type="number", @step=".01" } })
    </div>
</div> 

Ответы [ 2 ]

1 голос
/ 25 марта 2019

FormCollection - это набор пар ключ-значение (NameValueCollection), который возвращает значения в виде строки на основе предоставленного ключа, который также является строкой. Если вы сомневаетесь, какой числовой формат применяется при вводе чисел во время отправки, используйте комбинацию decimal.TryParse() и условие if с string.IsNullOrEmpty(), чтобы проверить нулевое / пустое строковое значение:

decimal expense;
if (!string.IsNullOrEmpty(formValues["expenseBackup"]) 
    && decimal.TryParse(formValues["expenseBackup"], out expense))
{
    var data = new usr_ebillingClientDatabase()
    {
        client = formValues["client"],
        expenseBackup = expense
    };

    // insert to database
}
else
{
    // unable to parse numeric value, do something else
}

Если вы уверены, что числовое представление, переданное в FormCollection, использует определенный десятичный разделитель, отличный от значения по умолчанию, используйте NumberFormatInfo при разборе с decimal.Parse() / decimal.TryParse():

var numberFormat = new System.Globalization.NumberFormatInfo() { NumberDecimalSeparator = "," };

var data = new usr_ebillingClientDatabase()
{
    client = formValues["client"],
    expenseBackup = decimal.Parse(formValues["expenseBackup"], numberFormat);
};

Однако я рекомендую использовать строго типизированную модель представления вместо FormCollection, потому что вы используете EditorFor, и она будет передавать значения свойств непосредственно в контроллер, когда имя модели представления включено в качестве параметра действия.

1 голос
/ 22 марта 2019

когда вы читаете поле из formValues["expenseBackup"], оно читается как строка. Преобразуйте его в десятичное число, используя Convert.ToDecimal().

expenseBackup = Convert.ToDecimal(formValues["expenseBackup"] ?? 0m);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...