2015-01-23 5 views
1

Я имел юридическое лицо:Ошибка проверки в ASP.NET

public class Book 
{ 
public int BookID{get; set;} 
public string BookName{get; set;} 
public int Price {get; set;} 
} 

Я scaffolded и создал контроллер и просмотров автоматически. Тогда я изменил свое лицо к этому:

public class Book 
{ 
public int BookID{get; set;} 
public string BookName{get; set;} 
public double Price {get; set;} 
} 

Я скопировал мой проект, а затем удаляется контроллер и вид, воссоздан их автоматически. Затем скопировал содержимое контроллера и представления из старого. Теперь, когда я вхожу в 18.75, я получаю «Значение« 18 .75 »недействительно для цены». ошибка. Как я могу исправить эту ситуацию? Благодарю.

+1

Введите «18,75», что кажется проблемой в текущей культуре и разделителе десятичной дроби. –

+3

Вы должны использовать 'decimal' для валюты, а не' double'. – SLaks

+0

@IgorSemin Когда я вхожу «18.75», я получаю: «Поле Цена должно быть числом». Я изменил цену на десятичный. – jason

ответ

1

Во всяком случае. Я избежать этого в то же время с помощью обработки десятичную ввода (в основном) не зависит от региональных настроек, имея мой собственный обработчик десятичное:

  1. в Startup/FilterConfig.cs:

    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
    
  2. Новый класс DecimalModelBinder:

    public class DecimalModelBinder : IModelBinder 
    { 
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
        { 
        ValueProviderResult valueResult = bindingContext.ValueProvider 
         .GetValue(bindingContext.ModelName); 
        ModelState modelState = new ModelState { Value = valueResult }; 
        object actualValue = null; 
        try 
        { 
         actualValue = GeneralHelper.ToDecimal(valueResult.AttemptedValue); 
        } 
        catch (FormatException e) 
        { 
         modelState.Errors.Add(e); 
        } 
    
        bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
        return actualValue; 
        } 
    } 
    

    функция GeneralHelper.ToDecimal() основана на следующей записи в блоге: https://sreindl.wordpress.com/2013/10/26/i18n-parsing-decimal-values/

+0

Благодарим вас за ответ. Фиктивный вопрос: я должен разместить класс DecimalModelBinder внутри App_Start, правильно? И должен ли я делать что-либо еще в Controller или Views? Спасибо. – jason

+0

Обычно я создаю папку «Фильтры» (если она не создается автоматически Visual Studio) и размещайте там классы фильтров (у меня есть несколько из них, особенно для обработки таблиц и региональных номеров/даты ...) –

1

Если культура на вашем сервере обрабатывает десятичные числа с помощью запятой, вам также нужно сообщить об утверждении jQuery, что она должна использовать запятую как десятичные разделители. Вы можете взглянуть на this blog-post (немного старый, но материал все еще работает) для общего подхода к обработке культуры. Код здесь делает магию:

$(document).ready(function() { 
    //Ask ASP.NET what culture we prefer, because we stuck it in a meta tag 
    var data = $("meta[name='accept-language']").attr("content") 
    //Tell jQuery to figure it out also on the client side. 
    $.global.preferCulture(data); 

    //Tell the validator, for example, 
    // that we want numbers parsed a certain way! 
    $.validator.methods.number = function (value, element) { 
     if ($.global.parseFloat(value)) { 
      return true; 
     } 
     return false; 
    } 
}); 

Обратите внимание, что ссылка на плагин глобализации jQuery не работает. It has been moved.

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

Смежные вопросы