#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 (значение, разделенное запятой).