2014-09-15 4 views
4

У меня проблема с десятичными числами.Десятичные числа в ASP.NET MVC 5 app

Если я использую. (Точка) вместо, (запятая) в текстовом поле, он принимает значение null в контроллере.

Я знаю его язык, потому что на испанском языке мы используем запятую вместо точки для десятичных знаков, но мне нужно использовать точку.

Это можно изменить? .

Это странно, потому что в контроллере я должен использовать (точка) для десятичных знаков, то есть:

я могу сделать float x = 3.14, но я не могу сделать float x = 3,14, так что я не понимаю этого ... В некоторых случаях у меня есть использовать точку ... в других я должен использовать запятую ...

Это мой код:

в модели:

[Display(Name = "Total")] 
public double Total { get; set; } 

Ввиду:

@Html.EditorFor(model => model.Total, new { id = "Total", htmlAttributes = new {@class = "form-control" } }) 

В контроллере:

public ActionResult Create([Bind(Include = "ID,Codigo,Fecha,Trabajo,Notas,BaseImponible,Iva,Total,Verificado,FormaDePagoID,ClienteID")] Presupuesto presupuesto) 
    { 
+1

Если это ASP.NET MVC, правильным тегом будет 'asp.net-mvc' (описания должны быть понятны, если вы их читаете) – crashmstr

ответ

0

Ваш контроллер использует C#. Специфический язык указывает, что . является десятичным разделителем. Период. Это не язык, а именно.

В вашей базе данных или пользовательском интерфейсе (который использует языковые настройки сервера) может использоваться другой разделитель десятичной дроби, чем используется язык C# по умолчанию (US). Вот почему вы должны использовать , в качестве разделителя.

0

Если вы хотите, чтобы ваша запятая (,), разделенных десятичную вход в интерфейс в соответствии с культурой пользовательского интерфейса, должны быть преобразованы в точка (.) Связывается с С номером # десятичного, вы можете пойти на Asp.Net MVC для связывания связующего объекта, где взята десятичная строка, разделенная запятой, и замените запятую точкой, а затем назначьте свойство C# decimal.

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

Надежда Следующие ссылки могут помочь вам:

ASP.Net MVC Custom Model Binding explanation http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/

6

Спасибо всем. Я нашел это code from Phil Haack, который работает очень хорошо.

Создание класса в любой папке вашего проекта

public class ModelBinder 
{ 
    public class DecimalModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, 
             ModelBindingContext bindingContext) 
     { 
      object result = null; 

      // Don't do this here! 
      // It might do bindingContext.ModelState.AddModelError 
      // and there is no RemoveModelError! 
      // 
      // result = base.BindModel(controllerContext, bindingContext); 

      string modelName = bindingContext.ModelName; 
      string attemptedValue = 
       bindingContext.ValueProvider.GetValue(modelName).AttemptedValue; 

      // Depending on CultureInfo, the NumberDecimalSeparator can be "," or "." 
      // Both "." and "," should be accepted, but aren't. 
      string wantedSeperator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator; 
      string alternateSeperator = (wantedSeperator == "," ? "." : ","); 

      if (attemptedValue.IndexOf(wantedSeperator) == -1 
       && attemptedValue.IndexOf(alternateSeperator) != -1) 
      { 
       attemptedValue = 
        attemptedValue.Replace(alternateSeperator, wantedSeperator); 
      } 

      try 
      { 
       if (bindingContext.ModelMetadata.IsNullableValueType 
        && string.IsNullOrWhiteSpace(attemptedValue)) 
       { 
        return null; 
       } 

       result = decimal.Parse(attemptedValue, NumberStyles.Any); 
      } 
      catch (FormatException e) 
      { 
       bindingContext.ModelState.AddModelError(modelName, e); 
      } 

      return result; 
     } 
    } 
} 

Добавить это Application_Start() метод в Global.asax

ModelBinders.Binders.Add(typeof(decimal), new ModelBinder.DecimalModelBinder()); 
    ModelBinders.Binders.Add(typeof(decimal?), new ModelBinder.DecimalModelBinder()); 

Теперь используйте десятичный тип вместо поплавка или двойной, и все будет хорошо! Спасибо, товарищи, увидимся!!

+0

Можете ли вы сделать это одинаково и по-прежнему использовать double? – Yoda