在MVC3十进制错误 - 该值是无效的现场(error with decimal in mvc3 -

2019-06-26 19:28发布

我下面的[开始使用ASP.NET MVC 3] [1]。 我不能用价格的价值= 9.99或9.99添加/编辑。 它说:“值‘9.99’是无效的价格。” 和“这个领域的价格必须是一个数字。”

如何解决这一问题?

模型:

    public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
}

public class MovieDbContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }
}

控制器:

public class MovieController : Controller
{
    private MovieDbContext db = new MovieDbContext();

    //
    // GET: /Movie/

    public ViewResult Index()
    {
        var movie = from m in db.Movies
                     where m.ReleaseDate > new DateTime(1984, 6, 1)
                     select m;

        return View(movie.ToList()); 
    }

    //
    // GET: /Movie/Details/5

    public ViewResult Details(int id)
    {
        Movie movie = db.Movies.Find(id);
        return View(movie);
    }

    //
    // GET: /Movie/Create

    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Movie/Create

    [HttpPost]
    public ActionResult Create(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Movies.Add(movie);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(movie);
    }

    //
    // GET: /Movie/Edit/5

    public ActionResult Edit(int id)
    {
        Movie movie = db.Movies.Find(id);
        return View(movie);
    }

    //
    // POST: /Movie/Edit/5

    [HttpPost]
    public ActionResult Edit(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }

    //
    // GET: /Movie/Delete/5

    public ActionResult Delete(int id)
    {
        Movie movie = db.Movies.Find(id);
        return View(movie);
    }

    //
    // POST: /Movie/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {            
        Movie movie = db.Movies.Find(id);
        db.Movies.Remove(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}
}

视图:

    @model MvcMovies.Models.Movie

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">       </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Movie</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Title)
        @Html.ValidationMessageFor(model => model.Title)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ReleaseDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ReleaseDate)
        @Html.ValidationMessageFor(model => model.ReleaseDate)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Genre)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Genre)
        @Html.ValidationMessageFor(model => model.Genre)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Price)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Price)
        @Html.ValidationMessageFor(model => model.Price)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>
public DbSet<Movie> Movies { get; set; }
}

Answer 1:

2年后我只是偶然在这一次。 我认为ASP.NET MVC 5已经解决了这一点,但看起来并非如此。 所以在这里不用怎么解决这个问题?

创建一个名为类DecimalModelBinder像以下,并将其添加到您的项目,例如根:

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;
        }
    }
}

里面Global.asax.cs,利用它Application_Start()是这样的:

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


Answer 2:

您是第非英语的客户之一,MS还没有预见到的。 你需要把一些额外的努力使你的版本上运行。 我有一个类似的问题,我否认这两个“9.99”和“9.99”为有效数字。 这似乎是一次服务器端验证失败,而一旦客户端验证,从而导致被接受没有数。

所以,你必须做出验证一致。

就像在评论中建议,看看http://msdn.microsoft.com/en-us/library/gg674880(VS.98).aspx和http://haacked.com/archive/2010/05/10 /globalizing-mvc-validation.aspx和数字/十进制领域的MVC 3 jQuery验证/全球化或-你应该懂德语(或者只是看看代码示例) http://www.andreas-reiff.de/2012/06 / probleme-MIT-mvcmovies-beispiel-validierung-DES-preises-MIT-dezimalstellen-schlagt-费尔/

BTW,存在对音乐和电影的例子教程都同样的问题。



Answer 3:

制定英语观众一个Web应用程序时,在荷兰一台PC我遇到了这个问题。

类型的模型属性双,生成该服务器端验证错误:

值“1.5”是无效的。

在一个断点,我看到在立即窗口中的这些值:

?System.Threading.Thread.CurrentThread.CurrentUICulture

{在} -US

?System.Threading.Thread.CurrentThread.CurrentCulture

{NL-NL}

作为解决方案(或者一个变通),您可以指定在web.config文件全球化设置。

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

当然,这意味着您强制用户在英文格式输入数字,但那仅仅是罚款,在我的情况。



Answer 4:

我解决了价格残疾人jQuery的这个问题,只验证服务器端为输入。 我找到了答案在这里: ASP .NET MVC禁用客户端验证,在每场级别

<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>


Answer 5:

我已经改编自Leniel Macaferi代码一点点,所以你可以将它用于任何类型:

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;
    }
}


Answer 6:

我试过@Leniel Macaferi但它并没有为我工作。

ModelState.IsValid没有接受数字格式类似于7.000,00

这个问题开始时,我从更改的属性类型:

[Column("PRICE")]
public decimal Price { get; set; }

[Column("PRICE")]
public decimal? Price { get; set; }

我也试着包括web.config中的全球化,我已经忘了

<globalization culture="pt-BR" uiCulture="pt-BR" enableClientBasedCulture="true" />

只有工作的解决方法是换回来的属性只为十进制:

[Column("PRICE")]
public decimal Price { get; set; }

并且也改变了表列不接受空值

希望它可以帮助别人。



Answer 7:

你可以加:

protected void Application_BeginRequest()
{
    var currentCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    currentCulture.NumberFormat.NumberDecimalSeparator = ".";
    currentCulture.NumberFormat.NumberGroupSeparator = " ";
    currentCulture.NumberFormat.CurrencyDecimalSeparator = ".";

    Thread.CurrentThread.CurrentCulture = currentCulture;
    //Thread.CurrentThread.CurrentUICulture = currentCulture;
}

Global.asax (上MVC 5.1测试)。 它的工作原理没有改变的UICulture我。



Answer 8:

就在评论此链接脚本:

<%--<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>--%>


文章来源: error with decimal in mvc3 - the value is not valid for field