none
C# MVC Edit Dezimal Eingabe Feld RRS feed

  • Frage

  • Hallo Forum,

    C# MVC

    ich habe da ein Problem mit der Eingabe von Zahlen.

    In der DB gibt es das Feld TarifPreis. Das ist dezimal für die Preiseingabe also zb 29,95

    Im Model habe ich hinterlegt.

     [Display(Name = "Tarif Preis")]
     [DataType(DataType.Currency)]
     public Nullable<decimal> TarifPreis { get; set; }

    Wenn ich in der DB den Wert direkt eingebe wir er in der View auch richtig zur Anzeige gebracht.

    Will ich den Wert in der View editieren wir er auch noch als 29,95 angezeigt.

    Versuche ich den Wert zu speichern kommt im Browser der Hinweis, "Tarif Preis muss eine Zahl sein"

    Warum Zahl ?

    Ändere ich das "," in einen "." kommt keine Meldung im Browser dafür kommt eine vom Controller.

    Diese.

    [ArgumentException: Das Parameterwörterbuch enthält einen NULL-Eintrag für den Parameter "TarifPreis" des Typs "System.Decimal", der NULL nicht zulässt, für die Methode "System.Web.Mvc.ActionResult EditVertragsDaten(System.String, Single, Int32, System.Decimal, Int32, System.DateTime)" in "xx.Controllers.DebitorenController". Optionale Parameter müssen Verweistypen oder Typen sein, die NULL zulassen, oder als optionale Parameter deklariert werden.
    Parametername: parameters]

    Warum steht hier was von  Single ??  

    System.String, Single, Int32, System.Decimal, Int32, System.DateTime

    Die Übergabe ist wie folgt.

     [HttpPost]
     [ValidateAntiForgeryToken] public ActionResult EditVertragsDaten(string xx, decimal TarifPreis , int xx, decimal xx, int xx, DateTime xx)
            {

    Kann mir jemand sagen was ich falsch mache ?

    Will einfach einen Währungsbetrag im Format zb 1.000,00 verarbeiten können.

    Habe schon einiges im Netz gesucht, aber bekomme es nicht hin.

    Bin für jede Info dankbar.

    VG  Roland


    Gruß Roland

    Samstag, 14. September 2019 15:49

Antworten

  • Hallo Roland,

    dein Problem ist die Lokalisierung. Die einfachste Möglichkeit das Problem zu umgehen is die Preise als string zu übergeben und erst im Model in Decimal umzuwandeln und dann in die DB speichern.

    Sonst bleibt eigentlich nur ASP.NET zu lokalisieren siehe Link   

    Ich persönlich kann niemandem empfehlen jquery-validation zu verwenden. Solltest Du dabei bleiben wollen, solltest Du die erste Möglichkeit wählen.

    Solltest Du ASP.NET Core verwenden, ist deutsche Lokalisierung recht einfach. Dazu muss man nur folgenden Code in Startup.Configure einfügen

    var cultureInfo = new CultureInfo("de-de");
    cultureInfo.NumberFormat.CurrencySymbol = "€";
    
    CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
    jquery-validation würde dann aber wahrscheinlich immer noch mekern


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Samstag, 14. September 2019 21:23
  • Wenn Du das so machen willst würde sich ein ViewModel anbieten. Das Model selbst bleibt wie es ist.

    Ich würde dir immer noch empfehlen jquery-vaidation zu entfernen und auch keine HTML Helper zu benutzen. In so gut wie allen Browsern kann man heute die Validierung dem Browser überlassen 

    <form>
        <input name="TarifPreis" type="number" step="0.01" required />
        <button type="submit">senden</button>
    </form>

    Dieser Code würde genau das machen was du willst ganz ohne Html Helper und jquery. Der Browser zeigt entsprechende Fehlermeldungen in der Landessprache des Users an.

    Sicherlich sollte man noch serverseitig validieren aber das muss man mit jquery auch

     

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings



    Sonntag, 15. September 2019 18:03

Alle Antworten

  • Hallo Roland,

    dein Problem ist die Lokalisierung. Die einfachste Möglichkeit das Problem zu umgehen is die Preise als string zu übergeben und erst im Model in Decimal umzuwandeln und dann in die DB speichern.

    Sonst bleibt eigentlich nur ASP.NET zu lokalisieren siehe Link   

    Ich persönlich kann niemandem empfehlen jquery-validation zu verwenden. Solltest Du dabei bleiben wollen, solltest Du die erste Möglichkeit wählen.

    Solltest Du ASP.NET Core verwenden, ist deutsche Lokalisierung recht einfach. Dazu muss man nur folgenden Code in Startup.Configure einfügen

    var cultureInfo = new CultureInfo("de-de");
    cultureInfo.NumberFormat.CurrencySymbol = "€";
    
    CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
    jquery-validation würde dann aber wahrscheinlich immer noch mekern


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Samstag, 14. September 2019 21:23
  • Hallo Thomas,

    vielen Dank für Deine Info.

    Im Model ist das ganze Dezimal. Ich lade auch die Datensätze aus der DB per SQL in das model

     while (rdr.Read())
                    {
                        model.ID = Convert.ToInt32(rdr["ID"]);
                        model.TarifPreis = Convert.ToDecimal(rdr["TarifPreis "].ToString());                }

    in der View wir das so übergeben.

    <div class="form-group">
            @Html.LabelFor(model => model.TarifPreis , htmlAttributes: new { @class = "control-label col-lg-8" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.TarifPreis , new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.TarifPreis , "", new { @class = "text-danger" })
            </div>
        </div>

    So wie ich Dich verstehe müsste ich das Model zu String machen und dann beim Speichern über SQL das ganze kontrollieren und wandeln.

    Und das für alle Felder die Preise beinhalten.

    VG Roland


    Gruß Roland

    Sonntag, 15. September 2019 17:14
  • Wenn Du das so machen willst würde sich ein ViewModel anbieten. Das Model selbst bleibt wie es ist.

    Ich würde dir immer noch empfehlen jquery-vaidation zu entfernen und auch keine HTML Helper zu benutzen. In so gut wie allen Browsern kann man heute die Validierung dem Browser überlassen 

    <form>
        <input name="TarifPreis" type="number" step="0.01" required />
        <button type="submit">senden</button>
    </form>

    Dieser Code würde genau das machen was du willst ganz ohne Html Helper und jquery. Der Browser zeigt entsprechende Fehlermeldungen in der Landessprache des Users an.

    Sicherlich sollte man noch serverseitig validieren aber das muss man mit jquery auch

     

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings



    Sonntag, 15. September 2019 18:03