Note: Forums will be making significant UX changes to address key usability improvements surrounding search, discoverability and navigation. To learn more about these changes please visit the announcement which can be found HERE.

Beantwortet ASP.NET MVC3 Validierung trotz int?

  • Dienstag, 12. März 2013 09:58
     
      Enthält Code

    Hallo,

    ich habe eine kleine Anwendung mit ASP.NET MVC3.

    Meine Modell Klasse sieht folgendermaßen aus:

        public class Einkauf
        {
            public int Id { get; set; }
            [Required(ErrorMessage = "Bezeichnung muss angegeben werden")]
            public string Bezeichnung { get; set; }
            [Required(ErrorMessage = "Preis muss angegeben werden")]
            [Range(0.01, 99.99, ErrorMessage = "Preis muss zwischen 0,01 und 99,99 liegen")]
            public decimal Preis { get; set; }
            public int? Anzahl { get; set; }
        }
    

    Mein Create.aspx lautet

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<EinkaufszettelMVC.Models.Einkauf>" %>
    
    <!DOCTYPE html>
    
    <html>
    <head runat="server">
        <title>Create</title>
    </head>
    <body>
        <script src="<%: Url.Content("~/Scripts/jquery-1.7.1.min.js") %>" type="text/javascript"></script>
        <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>
        
        <script src="<%: Url.Content("~/Scripts/globalize.js") %>" type="text/javascript"></script>
        <script src="<%: Url.Content("~/Scripts/globalize.culture.de-DE.js") %>" type="text/javascript"></script>
        <script type="text/javascript">
            $.validator.methods.number = function (value, element) {
                return !isNaN(Globalize.parseFloat(value));
            }
    
            $.validator.methods.range = function (value, element, param) {
                return Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1];
            }
    
            $(document).ready(function () {
                Globalize.culture('de-DE');
            });
        </script>
    
        <% using (Html.BeginForm()) { %>
            <%: Html.ValidationSummary(true) %>
            <fieldset>
                <legend>Einkauf</legend>
        
                <div class="editor-label">
                    <%: Html.LabelFor(model => model.Bezeichnung) %>
                </div>
                <div class="editor-field">
                    <%: Html.EditorFor(model => model.Bezeichnung) %>
                    <%: Html.ValidationMessageFor(model => model.Bezeichnung) %>
                </div>
        
                <div class="editor-label">
                    <%: Html.LabelFor(model => model.Preis) %>
                </div>
                <div class="editor-field">
                    <%: Html.EditorFor(model => model.Preis) %>
                    <%: Html.ValidationMessageFor(model => model.Preis) %>
                </div>
        
                <div class="editor-label">
                    <%: Html.LabelFor(model => model.Anzahl) %>
                </div>
                <div class="editor-field">
                    <%: Html.EditorFor(model => model.Anzahl) %>
                    <%: Html.ValidationMessageFor(model => model.Anzahl) %>
                </div>
        
                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        <% } %>
        
        <div>
            <%: Html.ActionLink("Back to List", "Index") %>
        </div>
    </body>
    </html>
    

    Obwohl in meiner Modell Klasse das int Feld Anzahl mit int? definiert ist, bekomme ich die Meldung "Das Feld "Anzahl" muss eine Zahl sein.", wenn ich das Feld leer lasse.

    Was muss ich noch tun, damit das Feld Anzahl optional wird?

    Walter


    Walter Taus

Alle Antworten

  • Dienstag, 12. März 2013 11:18
     
     

    Hallo Walter,
    Schau Dir mal folgenden Link an.
    http://stackoverflow.com/questions/7249665/error-assigning-null-to-a-nullable-int-the-value-null-is-not-valid-for-prop
    Dort wird als Resultat
    DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false
    dieser Eintrag in der APP_Start Methode hinzugefügt.

    HTH

    Güße Alexander

  • Dienstag, 12. März 2013 11:52
     
     

    Hallo Alexander,

    auch trotz Eintrag in Application_Start habe ich den Fehler nach wie vor.

    Grüße Walter


    Walter Taus

  • Mittwoch, 13. März 2013 09:23
     
     Beantwortet Enthält Code

    Hallo,

    Lösung gefunden. Die $.validator.methods.number  muss auf optional überprüfen. Korrekte Version lautet:

        <script type="text/javascript">
            $.validator.methods.number = function (value, element) {
                return this.optional(element) || !isNaN(Globalize.parseFloat(value));
            }
    
            $.validator.methods.range = function (value, element, param) {
                return this.optional(element) || Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1];
            }
    
            $(document).ready(function () {
                Globalize.culture('de-DE');
            });
    


    Walter Taus

    • Als Antwort markiert WalterTaus Mittwoch, 13. März 2013 09:23
    •