2012-08-06 21 views
24

我正在關注[ASP.NET MVC 3入門] [1]。而且我無法使用價格= 9.99或9,99的值進行添加/編輯。它說:「價值'9.99'對於價格無效。」和「字段價格必須是一個數字。」mvc3中的十進制錯誤 - 該值對字段無效

如何解決這個問題?

型號:

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

看看這個問題:http://stackoverflow.com/questions/5199835/mvc-3-jquery-validation-globalizing-of-number-decimal-field。這聽起來像你的驗證問題是文化特定的。 – 2012-08-06 04:20:15

+0

您正在運行網站的計算機的文化是什麼?文化是使用小數點還是小數點的逗號? – 2012-08-06 04:20:52

回答

31

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

裏面Application_Start()Global.asax.cs,利用它像這樣:

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

輝煌。如果ppl在十進制輸入中輸入有效的數字字符,那麼在JS中保存了很多時間。 – 2014-01-08 15:20:39

+0

記住傢伙,綁定不可爲​​空的小數點,只是刪除?從小數點開始 – 2014-11-06 03:10:37

+1

沒有在我的Mvc5Movie教程上工作 – 2014-12-19 17:19:39

6

您是第非英語custome之一rs,MS沒有預見到。您需要付出一些額外的努力才能使您的版本運行。我有類似的問題,否認「9,99」和「9.99」都是有效的數字。看起來好像一旦服務器端驗證失敗,並且一旦客戶端驗證,導致沒有號碼被接受。

所以你必須使驗證一致。

就像在評論中建議,看看 http://msdn.microsoft.com/en-us/library/gg674880(VS.98).aspxhttp://haacked.com/archive/2010/05/10/globalizing-mvc-validation.aspxMVC 3 jQuery Validation/globalizing of number/decimal field 或 - 你應該懂德語(或只是看看代碼示例) http://www.andreas-reiff.de/2012/06/probleme-mit-mvcmovies-beispiel-validierung-des-preises-mit-dezimalstellen-schlagt-fehl/

順便說一句,同樣的問題音樂和電影示例教程均存在。

-4

就評論這個鏈接腳本:

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

這並沒有解決問題,這只是_ignores_它。數字格式無效,必須予以解決。 – 2014-02-21 08:14:03

-1

您可以添加:

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。

0

我解決了這個問題,禁用jquery的價格,只有在服務器端驗證該輸入。我在這裏找到了答案: 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> 
1

我已經適應從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; 
    } 
} 
1

我開發時遇到過這個問題英國觀衆的網絡應用程序,在荷蘭的一臺PC上。

double類型的模型屬性,生成該服務器端驗證錯誤:

The value '1.5' is not valid for .

上的斷點,我在立即窗口看到這些值:

?System.Threading.Thread.CurrentThread.CurrentUICulture 

{en-US}

?System.Threading.Thread.CurrentThread.CurrentCulture 

{nl-NL}

作爲解決方案(或者解決方法),您可以在web.config文件中指定全球化設置。

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

當然這意味着你強迫你的用戶輸入英文格式的數字,但這對我來說很好。

1

我試過@Lieliel 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; } 

也改變表列不接受空值

希望它可以幫助別人。

相關問題