2017-08-20 2 views
1

Ich habe das gleiche Problem, das viele Leute bereits hatten - Model Binder akzeptiert keine lokalisierte Dezimaleingabe. In allen Threads, hier und anderen Foren, ist die empfohlene Lösung die Implementierung einer benutzerdefinierten ModelBinder.Implementieren benutzerdefinierter ModelBinder ASP.NET MVC

Mein Problem ist, dass diese Lösungen irgendwie nicht für mich arbeiten. Lassen Sie uns diese Lösung verwenden, zB: comma decimal seperator in asp.net mvc 5

Wenn ich alle Namespaces verweisen, zwei Fehler bleiben:

Fehler CS0115 ‚DecimalModelBinder.BindModel (Controller, ModelBindingContext)‘: keine geeignete Methode gefunden außer Kraft zu setzen .. werden kann.

und

Fehler CS0173 Art des bedingten Ausdrucks nicht davon abhalten verminten , weil es zwischen ‚Bool‘ und ‚Dezimal‘

Wo die zweite verweist auf die gesamte return Anweisung keine implizite Konvertierung ist.

Hat sich etwas im MVC Framework geändert, so dass dieser Code veraltet ist, oder mache ich etwas falsch?

Der Code, den ich mit am Ende ist:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.ModelBinding; 
using System.Web.Mvc; 

namespace AetMuzickaOprema.App_Start 
{ 
    public class DecimalModelBinder : System.Web.ModelBinding.DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, System.Web.ModelBinding.ModelBindingContext bindingContext) //first error 
     { 
      var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

      return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue); //second error 

     } 
    } 
} 

Modell Eigentum in Frage:

[Required] 
[Range(typeof(decimal), "0", "999999999")] 
public decimal Price { get; set; } 
+1

Hier wird erläutert, wie ein benutzerdefiniertes Modellbinder in aktualisierter Weise erstellt wird. https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding. Wenn Sie Probleme haben, werde ich für Sie bauen, aber zuerst versuchen. – PedroSouki

+0

Danke, ich werde es versuchen und Sie wissen lassen :) Ich weiß es zu schätzen – dzenesiz

+0

@PedroSouki Ich schaue auf den Artikel, seit Sie Ihren Kommentar gepostet, aber ich bin zu neu zu MVC, um es in meinem Fall zu nutzen. Wenn Sie bereit wären, mir zu zeigen, wie man es implementiert, so dass Dezimalwerte sowohl "1,25" als auch "1,25" akzeptieren würden, wäre ich sehr dankbar. – dzenesiz

Antwort

1

Es scheint letztlich das, was Sie versuchen, ist Eigentum Ebene wie diese Bindung so zu erreichen ?:

[PropertyBinder(typeof(PropertyBBinder))] 
public IList<int> PropertyB {get; set;} 

Wenn das richtig ist, bietet dieser Beitrag eine Lösung: Custom model binder for a property

Danke.

+0

Eigentlich ist es eine einzige Dezimaleigenschaft, die ich in die Frage aufnehmen werde. Ich weiß nicht, ob das nicht gilt. Danke für deine Antwort auf jeden Fall :) – dzenesiz

1

In ASP.NET-Core 1.1 (Microsoft.AspNetCore.Mvc.Core.Abstraction, 1.0.1.0) finden Sie die folgende Schnittstelle sehen

using System.Threading.Tasks; 

namespace Microsoft.AspNetCore.Mvc.ModelBinding 
{ 
    // 
    // Summary: 
    //  Defines an interface for model binders. 
    public interface IModelBinder 
    { 
     // 
     // Summary: 
     //  Attempts to bind a model. 
     // 
     // Parameters: 
     // bindingContext: 
     //  The Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext. 
     // 
     // Returns: 
     //  A System.Threading.Tasks.Task which will complete when the model binding process 
     //  completes. 
     //  If model binding was successful, the Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.Result 
     //  should have Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.IsModelSet 
     //  set to true. 
     //  A model binder that completes successfully should set Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.Result 
     //  to a value returned from Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.Success(System.Object). 
     Task BindModelAsync(ModelBindingContext bindingContext); 
    } 
} 

Modell Bindemittel in Microsoft.AspNetCore.Mvc.ModelBinding.Binders Namensraum definiert sind, Montage Microsoft.AspNetCore.Mvc.Core, Version=1.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60. Keiner von ihnen scheint BindModel() Methode auszusetzen, noch weniger eine virtuelle. Es sieht so aus, als ob Sie versuchen, eine nicht existierende Methode zu überschreiben.

Ein besserer Ansatz ist es, ein existierendes ModelBinder, eines, das am besten Ihren Bedürfnissen entspricht, davon zu übernehmen und ModelBindAsync() zu überschreiben.

+0

Vielen Dank für deine Antwort. Könnte ich Sie etwas weiter beschäftigen, indem ich frage, wo finde ich 'ModelBinder's in meinem Projekt? – dzenesiz

+1

"Modellbinder sind im Namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders, Assembly Microsoft.AspNetCore.Mvc.Core, Version = 1.0.1.0, Culture = neutral, PublicKeyToken = adb9793829ddae60" definiert. Genau genommen bedeutet dies, dass es in Ihrem Projekt keine MBs gibt. Sie können jedoch eine definieren und sie dort platzieren, wo Sie sie benötigen, zB im Ordner "Helfer" oder so ähnlich. Erben Sie einfach von DefaultModelBinder und überschreiben BindModelAsync. Oder benennen Sie ModelBind einfach in ModelBindAsync um, indem Sie die Signatur berücksichtigen. –

Verwandte Themen