2015-11-14 4 views
0

Я разрабатывает 5 приложения ASP .NET MVC в Visual Studio 2015. У меня есть простая модель, созданную:ASP .NET MVC 5 - десятичные всегда ноль в контроллере

public class Article 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Code { get; set; } 

    public string Description { get; set; } 

    public decimal Price { get; set; } 

} 

и стандарт, Visual Studio - контроллер и вид. Конечно, у меня проблема с ценовым десятичным полем. При попытке добавить/отредактировать существующую статью, когда я введу десятичное число, например, 5,45 Я получил ошибку проверки The field Price must be a number.. Если я наберу его как 5.45, я не получу эту ошибку, однако после отправки формы в мой контроллер Price свойство статьи равно 0. Я исследовал в Интернете и форумах и в соответствии с this post's answer создал модель связующего для десятичных знаков, как:

public class DecimalModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue); 

    } 
} 

, а затем в моем Global.asax.cs файле я положил две строки, чтобы добавить это связующее вещество для decimals:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     FluentValidationModelValidatorProvider.Configure(); 

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

Тем не менее, у меня все еще есть те же проблемы, ничего не изменилось.

Я также пытался принудить культуру моего компьютера, поставив следующий фрагмент кода в моей Web.config файл (в соответствии с рекомендациями в this tutorial):

<system.web> 
<globalization culture ="en-US" /> 
<!--elements removed for clarity--> 

, но все это время тот же вопрос: ( Можете ли вы мне помочь? Я полагаю, что у меня что-то не хватает, но я уже 10 раз принимал все возможные решения, и это все равно ...

Спасибо заранее!

+0

Убедитесь 'bindingContext.ValueProvider.GetValue' это вернуть десятичного не целое число. – Mehmood

+0

Странно, что если я поставил точку останова в моем методе BindModel в DecimalModelBinder и перешел на веб-страницу, пытаясь отредактировать или добавить новую статью с заполненной ценой, этот код никогда не будет выполнен ... Поэтому я думаю, что есть проблема с добавлением этого Binder к связующим по умолчанию ... но я понятия не имею, что это может быть. – DawidSibinski

+0

Я думаю, вы не прочли свой ответ (из вашей общей ссылки). Msgstr " – Mehmood

ответ

3

Вы должны осуществлять IModelBinder:

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

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return actualValue; 
    } 
} 

Тогда в вашем Global.asax.cs:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
+1

Спасибо за ваш ответ. Однако проблема была такой же - у меня просто был неправильный метод BindModel, который возвращал int вместо десятичного. ваше решение также работает;). – DawidSibinski

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