error with decimal in mvc3 - the value is not valid for field

后端 未结 9 1580
北荒
北荒 2020-11-29 08:03

I\'m following [Getting started with ASP.NET MVC 3][1]. And I can\'t add/edit with value of Price = 9.99 or 9,99. It said: \"The value \'9.99\' is not valid for Price.\" and

相关标签:
9条回答
  • 2020-11-29 08:36

    You are one of the non-English customers, which MS has not foreseen. You will need to put some extra effort into making your version run. I had a similar problem, denying me both "9,99" and "9.99" as valid numbers. It seems like once server-side validation failed, and once client-side validation, causing no number to be accepted.

    So you have to make the validation congruent.

    Like suggested in the comments, have a look at http://msdn.microsoft.com/en-us/library/gg674880(VS.98).aspx and http://haacked.com/archive/2010/05/10/globalizing-mvc-validation.aspx and MVC 3 jQuery Validation/globalizing of number/decimal field or - should you understand German (or just look at the code examples) http://www.andreas-reiff.de/2012/06/probleme-mit-mvcmovies-beispiel-validierung-des-preises-mit-dezimalstellen-schlagt-fehl/

    BTW, same problem exists for both the Music and Movie example tutorials.

    0 讨论(0)
  • 2020-11-29 08:36

    I've adapted the code from Leniel Macaferi a little bit so you can use it for any type:

    public class RequestModelBinder<TBinding> : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            ValueProviderResult valueResult = bindingContext.ValueProvider
                .GetValue(bindingContext.ModelName);
    
            ModelState modelState = new ModelState { Value = valueResult };
    
            object actualValue = null;
    
            if (valueResult.AttemptedValue != string.Empty)
            {
                try
                {
                    // values really should be invariant
                    actualValue = Convert.ChangeType(valueResult.AttemptedValue, typeof(TBinding), CultureInfo.CurrentCulture);
                }
                catch (FormatException e)
                {
                    modelState.Errors.Add(e);
                }
            }
    
            bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    
            return actualValue;
        }
    }
    
    0 讨论(0)
  • 2020-11-29 08:38

    Just comment this link for the script:

    <%--<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>--%>
    
    0 讨论(0)
  • 2020-11-29 08:40

    I just stumbled on this again after 2 years. I thought ASP.NET MVC 5 had solved this but looks like it's not the case. So here goes how to solve the problem...

    Create a class called DecimalModelBinder like the following and add it to the root of your project for example:

    using System;
    using System.Globalization;
    using System.Web.Mvc;
    
    namespace YourNamespace
    {   
        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;
    
                if(valueResult.AttemptedValue != string.Empty)
                {
                    try
                    {
                        actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
                    }
                    catch(FormatException e)
                    {
                        modelState.Errors.Add(e);
                    }
                }
    
                bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    
                return actualValue;
            }
        }
    }
    

    Inside Global.asax.cs, make use of it in Application_Start() like this:

    ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
    
    0 讨论(0)
  • 2020-11-29 08:46

    I encountered this issue when developing a web application for an English audience, on a Pc in The Netherlands.

    A model property of type double, generated this server-side validation error:

    The value '1.5' is not valid for .

    On an breakpoint, I saw these values in the Immediate Window:

    ?System.Threading.Thread.CurrentThread.CurrentUICulture
    

    {en-US}

    ?System.Threading.Thread.CurrentThread.CurrentCulture
    

    {nl-NL}

    As a solution (or maybe a work-around), you can specify the globalization settings in the web.config file.

    <configuration>
      <system.web>
        <globalization culture="en" uiCulture="en" />
    

    Of course this means that you force your users to enter numbers in English formatting, but that is just fine, in my case.

    0 讨论(0)
  • 2020-11-29 08:47

    I solved this problem by disabled jquery for price and only validate on server side for that input. I found the answer here: ASP .NET MVC Disable Client Side Validation at Per-Field Level

    <div class="col-md-10">
                    @{ Html.EnableClientValidation(false); }
                    @Html.EditorFor(model => model.DecimalValue, new { htmlAttributes = new { @class = "form-control" } })
                    @{ Html.EnableClientValidation(true); }
                    @Html.ValidationMessageFor(model => model.DecimalValue, "", new { @class = "text-danger" })
                </div>
    
    0 讨论(0)
提交回复
热议问题