Frage

Was Sie nähern empfehlen einen Datetime auf der Client-Seite in MVC für die Validierung?

Lassen Sie uns sagen, ich habe ein Modell mit einer Eigenschaft namens DateOfBirth, die ein DateTime ist, wie so.

public class UserModel
{
    [DataType(DataType.Date)]
    public DateTime DateOfBirth {get;set;}
}

Auf der Ansicht, ich habe eine einfache

<%: Html.LabelFor(model=>model.DateOfBirth) %>
<%: Html.EditorFor(model=>model.DateOfBirth) %>
<%: Html.ValidationMessageFor(model=>model.DateOfBirth) %>
<input type="submit" value="Submit" />

kann ich entweder das Microsoft MVC Validierungen oder die jQuery Validierungen verwenden. Wie erhalte ich die Datetime zu validieren clientseitige?

Ich weiß, alle Datatype tut, ist Hinweise Formatierung und macht nicht wirklich eine Validierung (es lässt diesen Teil der Modelbinder).

Grundsätzlich möchte ich duplizieren, was der Modelbinder tut, wenn er den Wertansatz in das Modell der DateOfBirth Eigenschaft zu setzen versucht.

Was sind Ihre Empfehlungen?

War es hilfreich?

Lösung

Wie oben vorgeschlagen, folgen Phil Haack Beitrag auf benutzerdefinierte Validierungen: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

Hier ist, wie ich es tun würde:


  1. Fügen Sie eine "DateFormatAttribute" Klasse, etwa so:

    public class DateFormatAttribute : ValidationAttribute {
      public override bool IsValid(object value) {    
        if (value == null) {
          return true;
        }

        // Note: the actual server side validation still has to be implemented :-)
        // Just returning true now...

        return true;
      }
    }

  1. Fügen Sie eine "DateFormatValidator" Klasse, etwa so:

    public class DateFormatValidator : DataAnnotationsModelValidator 
    {
      string message;

      public PriceValidator(ModelMetadata metadata, ControllerContext context
        , DateFormatAttribute attribute)
        : base(metadata, context, attribute) 
      {
        message = attribute.ErrorMessage;
      }

      public override IEnumerable GetClientValidationRules() 
      {
        var rule = new ModelClientValidationRule {
          ErrorMessage = message,
          ValidationType = "date" // note that this string will link to the JavaScript function we'll write later on
        };

        return new[] { rule };
      }
    }

  1. Register der oben genannten Klassen irgendwo in Global.asax.cs:

    DataAnnotationsModelValidatorProvider
        .RegisterAdapter(typeof(DateFormatAttribute), typeof(DateFormatValidator));

  1. Fügen Sie eine Validierungsfunktion auf dem Client. Beachten Sie, dass diese müssen implementiert werden, um das Gebietsschema des Benutzers attributng. Im Folgenden ist eine niederländische (nl-NL, NL-BE) clientseitige Validierung Funktion:

    /*
     * Localized default methods for the jQuery validation plugin.
     * Locale: NL
     */
    jQuery.extend(jQuery.validator.methods, {
        date: function(value, element) {
            return this.optional(element) || /^\d\d?[\.\/-]\d\d?[\.\/-]\d\d\d?\d?$/.test(value);
        }
    });

Das sollte die Dinge abdecken ...

Andere Tipps

Josh,

Ihr Problem ist ein recht häufiges Problem in MVC, das ist, dass der Modelbinder versucht, die eingegebenen Werte aus dem Formular in das Modell auf BIND. offensichtlich, wenn sie ‚fit‘ tut wird ein Fehler sofort bekommen.

so wie mache ich die Modelbinder Verwendung meiner benutzerdefinierten Validierung? und das Rück meiner Fehlermeldung?

gut, zuerst zu lesen und zu tun, die von Phil Haack Dinge geschrieben. dann haben Sie Ihre benutzerdefinierte Validierung.

die nächste Sache ist. Dont Verwendung Ganze Zahlen und Datetimes in Ihrem Modell! Wenn der Benutzer kann, was er in einer Textbox will, dies wird immer Probleme geben.

, was Sie tun sollten, ist, machen Sie eine flatObject des Objekts.

ein flatObject ist ziemlich einfach. Es ist ein Objekt, eine exakte Kopie der Variablen innerhalb nur die inst und Datetimes Strings sind (cos jene immer in der Modelbinder binden)

Beispiel:

namespace MVC2_NASTEST.Models {

    public partial class FlatNieuw {
        public int Niw_ID { get; set; }
        public string Niw_Datum { get; set; }
        public string Niw_Titel { get; set; }
        public string Niw_Bericht { get; set; }
        public int Niw_Schooljaar { get; set; }
        public bool Niw_Publiceren { get; set; }
    }
}

die einzigen Ints ich habe, sind aus dem Aufklappmenü, cos diejenigen tun sie nicht ausfallen, wenn der Wert in dem Aufklappmenü Ints sind. das Datum (Datum) ist eine Zeichenfolge. i tun, um die benutzerdefinierte Validierung auf dieser Zeichenfolge. die Modelbinder bindet an diesem FlatNieuw Objekt.

meine Nieuw-Klasse hat genau die gleichen Namen von Feldern, wie diese Klasse. so, wenn Sie verwenden Updatemodel () das funktioniert noch. wenn Sie einen neuen Eintrag machen, können Sie AutoMapper dieses flatObject zu Ihrem normalen Objekt abzubilden.

ich das denke, zusammen mit phil haack Blog sollten Sie geben eine Hand auf, wie dies zu tun. wenn Sie Fragen haben nicht zögern zu fragen.

bin ich gegen das gleiche Problem und kann nicht eine Lösung finden. Ich kann nicht glauben, dass jeder nicht in dieses Problem laufen. Ich war mit dem jquery.maskedinput.js Modul und es funktionierte großartig, aber als ich begann, die „[Datatype (DataType.Date)]“ Dekoration mit „EditorFor“ wenn Abtretungsempfänger der Datetime-Eingabe eine Klasse class = "text-Feld Hinzufügen einzelne Zeile". Das Hinzufügen dieser Klasse bricht die maskedinput js. Es formatiert auch meine Unterdaten als „1010.02.03“, die dann meinen Jquery Maske blasen von „99/99/9999“.

nach meiner Erfahrung einige Male entweder Microsoft MVC Validierungen oder die jQuery Validierungen ist ein über töten für einige Projekte, die wir entwickeln. Deshalb einige Male i-Code / greifen kleine von mir selbst.

Lösung One: Benutzerdefinierte Plugin (Sie können es in die Art und Weise passt ändern Sie)

(function($) {
    $.fn.extend({
            ValidateInput: function() {
                var bValid = true;
                this.removeClass('ui-state-error');
                this.each(function() {
                    if ($(this).hasClass('date')) {

                            var valdate = checkRegexp($(this), /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2]\d{3})$/, "date format is wrong, please input as dd/MM/yyyy, e.g. 02/28/2010");
                            if (!valdate) {
                                $(this).val("input in 'dd/mm/yyyy' format");
                            }
                            bValid = bValid && valdate;
                return bValid;

                        }
                }); 

    }});

    function checkRegexp(o, regexp, n) {
        if (!(regexp.test(o.val()))) {
            o.addClass('ui-state-error');
            //updateTips(n);
            return false;
        } else {
            return true;
        }
        }

 })(jQuery);

auf Ihrer Ansicht:

  1. Add class = 'Datum', um Ihre Eingabe Box
  2. das Plugin aufrufen $("#yourInput").alidateInput();

Lösung 2: Mit JQuery UI Datum auszuwählen (die Lösung, die ich jetzt bin mit)

     <script language="javascript" type="text/javascript">
            $(function() {
// use date picker to your textbox input 
                $(".yourInput").datepicker();
                $(".yourInput").datepicker('option', { dateFormat: "dd/mm/yy" });
// disable any human input to the textbox input
                $(".yourInput").keyup(function() {
                    $(this).val("");
                });
            });
        </script>

Weitere Details zu Lösung 2: http://www.gregshackles.com/2010/03/templated-helpers-and-custom-model-binders-in-asp-net-mvc-2/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top