Knockout validation

后端 未结 3 779
不思量自难忘°
不思量自难忘° 2020-12-02 13:03

I have asp.net mvc3 project where I do a bulk edit on a table with knockout binding. I want to do validations like required and number validations while saving data. Is ther

相关标签:
3条回答
  • 2020-12-02 13:33

    Have a look at Knockout-Validation which cleanly setups and uses what's described in the knockout documentation. Under: Live Example 1: Forcing input to be numeric

    You can see it live in Fiddle

    UPDATE: the fiddle has been updated to use the latest KO 2.0.3 and ko.validation 1.0.2 using the cloudfare CDN urls

    To setup ko.validation:

    ko.validation.rules.pattern.message = 'Invalid.';
    
    ko.validation.configure({
        registerExtenders: true,
        messagesOnModified: true,
        insertMessages: true,
        parseInputAttributes: true,
        messageTemplate: null
    });
    

    To setup validation rules, use extenders. For instance:

    var viewModel = {
        firstName: ko.observable().extend({ minLength: 2, maxLength: 10 }),
        lastName: ko.observable().extend({ required: true }),
        emailAddress: ko.observable().extend({  // custom message
            required: { message: 'Please supply your email address.' }
        })
    };
    
    0 讨论(0)
  • 2020-12-02 13:38

    If you don't want to use the KnockoutValidation library you can write your own. Here's an example for a Mandatory field.

    Add a javascript class with all you KO extensions or extenders, and add the following:

    ko.extenders.required = function (target, overrideMessage) {
        //add some sub-observables to our observable
        target.hasError = ko.observable();
        target.validationMessage = ko.observable();
    
        //define a function to do validation
        function validate(newValue) {
        target.hasError(newValue ? false : true);
        target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
        }
    
        //initial validation
        validate(target());
    
        //validate whenever the value changes
        target.subscribe(validate);
    
        //return the original observable
        return target;
    };
    

    Then in your viewModel extend you observable by:

    self.dateOfPayment: ko.observable().extend({ required: "" }),
    

    There are a number of examples online for this style of validation.

    0 讨论(0)
  • 2020-12-02 13:49

    Knockout.js validation is handy but it is not robust. You always have to create server side validation replica. In your case (as you use knockout.js) you are sending JSON data to server and back asynchronously, so you can make user think that he sees client side validation, but in fact it would be asynchronous server side validation.

    Take a look at example here upida.cloudapp.net:8080/org.upida.example.knockout/order/create?clientId=1 This is a "Create Order" link. Try to click "save", and play with products. This example is done using upida library (there are spring mvc version and asp.net mvc of this library) from codeplex.

    0 讨论(0)
提交回复
热议问题