2012-08-06 2 views
24

Ich folge [Erste Schritte mit ASP.NET MVC 3] [1]. Und ich kann nicht hinzufügen/bearbeiten mit Wert von Preis = 9,99 oder 9,99. Er sagte: "Der Wert '9.99' ist nicht für Preis gültig." und "Das Feld Preis muss eine Zahl sein."Fehler mit Dezimal in mvc3 - der Wert ist nicht gültig für Feld

Wie behebt man das?

Modell:

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

Controller:

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

Ausblick:

@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

Werfen Sie einen Blick auf diese Frage: http://stackoverflow.com/questions/5199835/mvc-3-jquery-validation-globalizing-of-number-decimal-field. Es scheint, dass Ihre Validierungsprobleme kulturspezifisch sind. –

+0

In welcher Kultur ist der Computer, auf dem die Website ausgeführt wird, eingestellt? Verwendet die Kultur den Dezimalpunkt oder das Komma für Dezimalstellen? –

Antwort

31

Ich bin gerade nach 2 Jahren wieder darüber gestolpert. Ich dachte, dass ASP.NET MVC 5 dies gelöst hat, aber es sieht so aus, als wäre es nicht der Fall. So, hier geht, wie das Problem zu lösen ...

Erstellen Sie eine Klasse DecimalModelBinder wie folgt aus und fügen Sie es an die Wurzel des Projekts zum Beispiel genannt:

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

Innen Global.asax.cs, nutzen es in Application_Start() dies wie:

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

Brilliant. Habe mir so viel Zeit erspart, indem ich in JS validierte, wenn ppl gültige numerische Zeichen in dezimale Eingabe setzte. –

+0

Erinnern Sie sich an Jungs, um nicht nullbare Dezimalzahlen zu binden, entfernen Sie einfach die? von der Dezimalstelle –

+1

Ich habe nicht an meinem Mvc5Movie-Tutorial gearbeitet –

6

Sie sind einer der nicht-englischen custome rs, die die MS nicht vorgesehen hat. Sie müssen etwas mehr Aufwand in die Ausführung Ihrer Version investieren. Ich hatte ein ähnliches Problem und leugnete mir sowohl "9,99" als auch "9,99" als gültige Nummern. Es scheint, als ob die serverseitige Validierung fehlschlug und nach der clientseitigen Validierung keine Zahl mehr akzeptiert wurde.

Sie müssen also die Validierung kongruent machen.

Wie in den Kommentaren vorgeschlagen, einen Blick auf http://msdn.microsoft.com/en-us/library/gg674880(VS.98).aspx und http://haacked.com/archive/2010/05/10/globalizing-mvc-validation.aspx und MVC 3 jQuery Validation/globalizing of number/decimal field oder - sollten Sie Deutsch verstehen (oder an den Code-Beispiele anschauen) http://www.andreas-reiff.de/2012/06/probleme-mit-mvcmovies-beispiel-validierung-des-preises-mit-dezimalstellen-schlagt-fehl/

BTW, das gleiche Problem existiert für die Beispiel-Tutorials für Musik und Film.

-4

Kommentar einfach diesen Link für das Skript:

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

Das löst das Problem nicht, das ist nur _ignores_ it. Das Zahlenformat ist ungültig und muss adressiert werden. –

-1

können Sie fügen:

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

Um Global.asax (getestet auf MVC 5.1). Es funktioniert, ohne UICulture für mich zu ändern.

0

Ich löste dieses Problem durch deaktiviert jquery für Preis und nur auf der Serverseite für diesen Eingang validieren.Ich fand die Antwort hier: 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

ich den Code aus Leniel Macaferi ein wenig angepasst haben, so dass Sie es für jede Art verwenden können:

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

ich dieses Problem auftreten, wenn ein Entwicklungs Web-Anwendung für ein englisches Publikum, auf einem PC in den Niederlanden.

Ein Modell-Eigenschaft vom Typ double, generiert dieses serverseitige Validierung Fehler:

The value '1.5' is not valid for .

Auf einem Haltepunkt, sah ich diese Werte in der Direkt-Fenster:

?System.Threading.Thread.CurrentThread.CurrentUICulture 

{en-US}

?System.Threading.Thread.CurrentThread.CurrentCulture 

{nl-NL}

Als Lösung (oder möglicherweise eine Problemumgehung) können Sie die Globalisierungseinstellungen in der Datei web.config angeben.

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

Natürlich bedeutet dies, dass Sie Ihre Benutzer dazu zwingen, Zahlen in Englisch Formatierung eingeben, aber das ist ganz gut, in meinem Fall.

1

Ich habe versucht @Leniel Makeri aber es hat nicht für mich funktioniert.

ModelState.IsValid nicht akzeptieren Zahlen formatiert wie 7.000,00

Das Problem begann, als ich den Objekttyp geändert von:

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

zu

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

Ich habe versuchte auch, die Globalisierung auf web.config einzubeziehen, die ich vergessen hatte

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

Die einzige Lösung, die funktionierte war die Eigenschaft, nur in Dezimalzahlen ändern zurück:

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

und verändert auch die Tabellenspalte keine Nullwerte

akzeptieren Hoffe, dass es jemand hilft.

Verwandte Themen