Benutzer mit den meisten Antworten
C# MVC Edit Dezimal Eingabe Feld

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
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- Bearbeitet Thomas Wycichowski Samstag, 14. September 2019 21:23
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 19. September 2019 08:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 30. September 2019 12:24
-
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
- Bearbeitet Thomas Wycichowski Sonntag, 15. September 2019 18:10
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 19. September 2019 08:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 30. September 2019 12:24
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- Bearbeitet Thomas Wycichowski Samstag, 14. September 2019 21:23
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 19. September 2019 08:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 30. September 2019 12:24
-
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
-
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
- Bearbeitet Thomas Wycichowski Sonntag, 15. September 2019 18:10
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 19. September 2019 08:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 30. September 2019 12:24