почему текстовое поле всегда возвращает null, когда в числах есть запятые?

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

У меня есть контроллер, вид и модель, как показано ниже

 //model
public class ItemViewModel
{
   public string name {get;set;}
   public decimal? TotalPrice { get; set; }
}

//controller
[HttpPost]
[MultipleButton(Name = "action", Argument = "Submit")]
public ActionResult Submit(ItemViewModel model)
{
   decimal? a = model.TotalPrice;
   Console.WriteLine(a);
}

//view
@Html.EditorFor(model => model.TotalPrice, new { htmlAttributes = new { @class = "form-control" } })
<input type="submit" name="action:Submit" class="btn btn-primary" value="Submit"/>
  

когда я отлаживаю модель.Итоговая цена всегда равна нулю, когда в числе есть запятые, например 10 234 776, но если запятой нет, то получается фактический результат. есть идеи?

Комментарии:

1. Каков код модели? Есть ли какой-либо атрибут проверки в свойстве?

2. Где-то вам нужно будет указать, что при синтаксическом анализе значений должны допускаться тысячи разделителей.

3. Что, если вы используете точки (например) 10.234

4. Поделитесь ItemViewModel, поскольку я предполагаю, что могут возникнуть проблемы с привязкой данных.

5. Похоже, что у связующего модели по умолчанию могут возникнуть проблемы с преобразованием введенной вами общей цены в десятичную дробь в первую очередь. Одним из решений может быть изменение вашего TotalPrice на строковый тип, а затем написать свою логику для преобразования строки в десятичный (с запятой или без запятой).

Ответ №1:

 //Change your ItemViewModel like
public class ItemViewModel
{
    public string name { get; set; }
    public string TotalPrice { get; set; }
}
//Introduce your custom Parser to handle the comma case
private  bool MyTryParse(string toParse, out decimal result)
{
    //Remove commas
    string formatted = toParse.Replace(",", "");

    return decimal.TryParse(formatted, out result);
}

//And your controller be like
[HttpPost]
[MultipleButton(Name = "action", Argument = "Submit")]
public ActionResult Submit(ItemViewModel model)
{
    decimal a = null;

    if (MyTryParse(model.TotalPrice, out a))
    {
        //Success code
    }
    else
    {
        //some error code
    }

    Console.WriteLine(a);
}
  

Примечание: Возможно, не лучшее, но работоспособное решение. Надеюсь, это поможет в вашем случае.

Комментарии:

1. @chaeusang чен

Ответ №2:

Вашему коду нужна десятичная дробь, текстовому полю нужна строка. ViewModel — это то место, где вы выполняете преобразование.

 private decimal totalPriceDecimal;
private string totalPriceString;

    public string TotalPrice
    {
        get
        {
            return this.totalPriceString();
        }

        set
        {
            this.totalPriceString = value;

            decimal temp;
            if (int.TryParse(value, out temp))
            {
                this.totalPriceDecimal = temp;
            }
        }
    }
  

Тогда ваш код, которому требуется десятичное число, может использовать totalPriceDecimal, в то время как вы можете привязать строку к текстовому полю.

Что еще более важно, если пользователь вводит что-то, что не может быть проанализировано, вы знаете и можете отобразить сообщение об ошибке.

Ответ №3:

я попробовал это, и это работает нормально, ниже приведен код и назначенный вид

 [HttpPost]

public ActionResult Submit(ItemViewModel model)
 {
   decimal? a = model.TotalPrice;
   Console.WriteLine(a);
   return View();
 }

public ActionResult Submit()
  {
    return View();
  }
  

//===================== Просмотреть============================

@model WebApplication4.Контроллеры.ItemViewModel

@Html.BeginForm() { @Html.EditorFor(модель => модель.TotalPrice, new { htmlAttributes = new { @class = «form-control» } }) }

Комментарии:

1. Проблема заключалась в том, что в качестве входных данных было передано 10 234 776 (значение, разделенное запятой).