2012-08-06 47 views
24

Tôi đang theo [Bắt đầu với ASP.NET MVC 3] [1]. Và tôi không thể thêm/chỉnh sửa với giá trị của Giá = 9,99 hoặc 9,99. Nó nói: "Giá trị '9,99' không hợp lệ cho Giá." và "Trường Giá phải là một số."lỗi có số thập phân bằng mvc3 - giá trị không hợp lệ cho trường

Cách sửa lỗi này?

mẫu:

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

Bộ điều khiển:

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

Xem:

@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

Hãy xem câu hỏi này: http://stackoverflow.com/questions/5199835/mvc-3-jquery-validation-globalizing-of-number-decimal-field. Có vẻ như vấn đề xác thực của bạn là văn hóa cụ thể. –

+0

Văn hóa nào là máy tính bạn đang chạy trang web được đặt thành? Văn hóa có sử dụng dấu thập phân hay dấu phẩy cho số thập phân không? –

Trả lời

31

Tôi chỉ tình cờ gặp lại vấn đề này sau 2 năm. Tôi nghĩ ASP.NET MVC 5 đã giải quyết vấn đề này nhưng có vẻ như không phải vậy. Vì vậy, ở đây đi làm thế nào để giải quyết vấn đề ...

Tạo một lớp được gọi là DecimalModelBinder như sau và thêm nó vào thư mục gốc của dự án của bạn ví dụ:

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

Bên Global.asax.cs, làm sử dụng nó trong Application_Start() như thế này:

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

Rực rỡ. Đã lưu cho tôi rất nhiều thời gian xác thực trong JS nếu ppl đặt các ký tự số hợp lệ vào đầu vào thập phân. –

+0

Hãy nhớ rằng các chàng trai, để ràng buộc các số thập phân không nullable, chỉ cần loại bỏ? từ số thập phân –

+1

Không hoạt động trên hướng dẫn Mvc5Movie của tôi –

6

Bạn là một trong những custome không phải tiếng Anh rs, mà MS không lường trước được. Bạn sẽ cần phải nỗ lực thêm để làm cho phiên bản của bạn chạy. Tôi đã có một vấn đề tương tự, phủ nhận tôi cả "9,99" và "9,99" là số hợp lệ. Dường như khi xác thực phía máy chủ không thành công và sau khi xác thực phía máy khách, không có số nào được chấp nhận.

Vì vậy, bạn phải thực hiện xác thực hợp lệ.

Giống như gợi ý trong các ý kiến, có một cái nhìn tại 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 hay - bạn nên hiểu Đức (hoặc chỉ cần nhìn vào các ví dụ mã) http://www.andreas-reiff.de/2012/06/probleme-mit-mvcmovies-beispiel-validierung-des-preises-mit-dezimalstellen-schlagt-fehl/

BTW, cùng một vấn đề tồn tại cho cả hướng dẫn ví dụ về Âm nhạc và Phim.

-4

Chỉ cần bình luận liên kết này cho kịch bản:

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

Điều này không giải quyết vấn đề, điều này chỉ _ignores_ nó. Định dạng số không hợp lệ và phải được giải quyết. –

-1

Bạn có thể thêm:

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 (thử nghiệm trên MVC 5.1). Nó hoạt động mà không thay đổi UICulture cho tôi.

0

Tôi đã giải quyết vấn đề này bằng cách vô hiệu hóa giá jquery và chỉ xác thực ở phía máy chủ cho đầu vào đó.Tôi tìm thấy câu trả lời ở đây: 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

Tôi đã thích nghi mã từ Leniel Macaferi một chút để bạn có thể sử dụng nó cho bất kỳ loại:

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

tôi gặp phải vấn đề này khi phát triển một ứng dụng web cho một đối tượng tiếng Anh, trên PC ở Hà Lan.

Một tài sản mô hình kiểu double, tạo này xác nhận lỗi server-side:

The value '1.5' is not valid for .

Trên một breakpoint, tôi thấy những giá trị trong ngay Window:

?System.Threading.Thread.CurrentThread.CurrentUICulture 

{en-US}

?System.Threading.Thread.CurrentThread.CurrentCulture 

{nl-NL}

Là một giải pháp (hoặc có thể là một work-around), bạn có thể chỉ định các thiết lập toàn cầu hóa trong tệp web.config.

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

Tất nhiên điều này có nghĩa là bạn buộc người dùng nhập số bằng định dạng tiếng Anh, nhưng điều đó là tốt, trong trường hợp của tôi.

1

Tôi đã thử @Leniel Macaferi nhưng không hiệu quả đối với tôi.

ModelState.IsValid không chấp nhận số định dạng giống như 7.000,00

Vấn đề bắt đầu khi tôi thay đổi loại tài sản từ:

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

để

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

Tôi đã cũng đã cố gắng đưa toàn cầu hóa vào web.config mà tôi đã quên

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

Cách giải quyết duy nhất mà làm việc đã thay đổi lại tài sản để thập phân chỉ:

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

và cũng thay đổi cột bảng để KHÔNG chấp nhận các giá trị null

Hy vọng nó sẽ giúp ai đó.

Các vấn đề liên quan