This article explains how to create a multi-step registration form with Kendo UI MVVM pattern using Web API2 and Entity Framework 5.
Just create a Web API project as shown in Figure 1 and Figure 2.
Figure 1
In my case I named the project MultiStepRegistration.
Figure 2
The Project structure will be as shown in Figure 3.
Figure 3
Here I am using the Entity Framework Code First technique to connect with the database.
Create a model class and name it RegistrationMultiStep.cs.
Use the following code in that class:
- public class RegistrationMultiStep
- {
- [Key]
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- public int UserID {
- get;
- set;
- }
- [Required]
- public string FirstName {
- get;
- set;
- }
- [Required]
- public string LastName {
- get;
- set;
- }
- [Required]
- public string Email {
- get;
- set;
- }
- [Required]
- public DateTime DOB {
- get;
- set;
- }
- public string State {
- get;
- set;
- }
- public string City {
- get;
- set;
- }
- [Required]
- public string Country {
- get;
- set;
- }
- [Required]
- public string UserName {
- get;
- set;
- }
- }
Create one more model class and name it MultiStepRegistrtionContext.cs.
Use the following code in that class:
- public class MultiStepRegistrtionContext: DbContext {
- public MultiStepRegistrtionContext(): base("name=TestConnection") {}
- public DbSet < RegistrationMultiStep > MultiPathRegistration {
- get;
- set;
- }
- }
- <connectionStrings>
- <add name="TestConnection" connectionString="Data Source=Server name;Initial Catalog=Database Name;Integrated Security=True" providerName="System.Data.SqlClient" />
- </connectionStrings>

Figure 4
Figure 5
The preceding procedure will scaffold the REST full service in the RegistrationMultistepsController.
You will get some pre-defined HTTP GET, POST, PUT and DELETE requests/responses in the RegistrationMultiSteps Controller. Modify the code based on your application requirements. For this example I did not modify the code.
To insert a record into the RegistrationMultiStep table we should use HTTP POST requests and responses.
Before implementing it in the Kendo UI once check that the service is in Postman / Fiddler.
Design the UI to consume the service.
I have used KendoUI with the MVVM pattern.
Here is my design:
- <!DOCTYPE html>
- <html
- xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'></script>
- <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1316/styles/kendo.common.min.css" />
- <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1316/styles/kendo.default.min.css" />
- <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1316/styles/kendo.dataviz.min.css" />
- <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1316/styles/kendo.dataviz.default.min.css" />
- <script src="http://cdn.kendostatic.com/2014.3.1316/js/jquery.min.js"></script>
- <script src="http://cdn.kendostatic.com/2014.3.1316/js/kendo.all.min.js"></script>
- <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
- <script src="Js/ViewModel/RegisterViewModel.js"></script>
- <script src="Js/Model/RegisterData.js"></script>
- <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
- <title></title>
- </head>
- <body>
- <div>
- <div class="container" id="example1"></div>
- <div id="Uploadwindow"></div>
- </div>
- <div id="example" style="align-content:center;margin:20px 20px 10px 10px">
- <div id="RegistrationForm">
- <div id="step1" class="container" style="align-content:center">
- <h3>Personal details </h3>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="fname" class="required">First Name*:</label>
- </div>
- <div class="col-lg-3">
- <input type="text" id="fname" name="FirstName" data-bind="value: firstName" class="k-textbox" required />
- </div>
- <div class="col-lg-3">
- <span class="k-invalid-msg" data-for="fname"></span>
- </div>
- </div>
- <br />
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="lname">Last Name*:</label>
- </div>
- <div class="col-lg-3">
- <input id="lname" name="LastName" data-bind="value: lastName" class="k-textbox" required />
- </div>
- <div class="col-lg-3">
- <span class="k-invalid-msg" data-for="lname"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="email">Email*:</label>
- </div>
- <div class="col-lg-3">
- <input type="email" name="Email" id="Email" data-bind="value: Email" class="k-textbox" required />
- </div>
- <div class="col-lg-3">
- <span class="k-invalid-msg" data-for="email"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="DOB">DOB*:</label>
- </div>
- <div class="col-lg-3">
- <input id="Dob" name="DOB" data-role="datepicker"
- data-bind="visible: isVisible, enabled: isEnabled, value: selectedDate" required />
- <span class="k-invalid-msg" data-for="DOB"></span>
- </div>
- </div>
- <br />
- <input type="button" value="Continue" id="continue" onclick="ValidatePersonal()" class="btn btn-default button">
- </div>
- <div id="step2" style="display:none;align-content:center">
- <br />
- <br />
- <h3> Contact Info </h3>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="City">City:</label>
- </div>
- <div class="col-lg-3">
- <input id="City" data-bind="value: City" class="k-textbox" name="City"/>
- <span class="k-invalid-msg" data-for="City"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="State">State:</label>
- </div>
- <div class="col-lg-3">
- <input id="State" data-bind="value: State" class="k-textbox" name="State" />
- <span class="k-invalid-msg" data-for="State"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="Country">Country*:</label>
- </div>
- <div class="col-lg-3">
- <input id="Country" data-bind="value: Country" name="Country" required class="k-textbox" />
- <span class="k-invalid-msg" data-for="Country"></span>
- </div>
- </div>
- <br />
- <br />
- <input type="button" value="Back" id="Back" class="btn btn-default button" onclick="BackAddress()">
- <input type="button" value="Continue" id="continue1" class="btn btn-default button" onclick="ValidateAddress()">
- </div>
- <div id="step3" style="display:none">
- <h3>Login Information</h3>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="UserName">User Name*:</label>
- </div>
- <div class="col-lg-3">
- <input id="UserName" data-bind="value: UserName" name="Username" class="k-textbox" required />
- <span class="k-invalid-msg" data-for="Username"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="password">Password*:</label>
- </div>
- <div class="col-lg-3">
- <input required type="password" id="Password" name="Password" data-bind="value: Passsword" class="k-textbox" />
- <span class="k-invalid-msg" data-for="Password"></span>
- </div>
- </div>
- <br />
- <div class="row">
- <div class="col-lg-3">
- <label for="ConfirmPwd">Confirm Password*:</label>
- </div>
- <div class="col-lg-3">
- <input required type="password" name="Confirmpassword" id="Confirmpassword" data-bind="value: ConfirmPwd" class="k-textbox" />
- <span class="k-invalid-msg" data-for="Confirmpassword"></span>
- </div>
- </div>
- <br />
- <input type="button" value="Back" id="Back3" class="btn btn-default button" onclick="BackUser()">
- <input type="button" onclick="RegisterUser()" class="btn btn-default button" value="Submit" />
- </div>
- </div>
- </div>
- </body>
- </html>
The View Model Script:
- $(document).ready(function() {
- var viewModel = kendo.observable({
- firstName: "",
- MiddleName: "",
- Email: null,
- selectedDate: null,
- isPrimitive: false,
- isVisible: true,
- isEnabled: true,
- confirmed: false,
- City: null,
- State: null,
- Country: null,
- UserName: null,
- Passsword: null,
- ConfirmPwd: null,
- });
- kendo.bind($("#example"), viewModel);
- });
KendoValidation and Ajax script:
- function RegisterUser() {
- var validator = $("#RegistrationForm").kendoValidator({
- rules: {
- PasswordRequired: function(input) {
- var ret = true;
- if (input.is("[id=Password]")) {
- ret = $("#Password").val().length > 0;
- }
- return ret;
- },
- PasswordLength: function(input) {
- var ret = true;
- if (input.is("[id=Password]")) {
- ret = $("#Password").val().length > 6;
- }
- return ret;
- },
- ConfirmPasswordRequired: function(input) {
- var ret = true;
- if (input.is("[id=Confirmpassword]")) {
- ret = $("#Confirmpassword").val().length > 0;
- }
- return ret;
- },
- CheckConfirmPassword: function(input) {
- var ret = true;
- if (input.is("[id=Confirmpassword]")) {
- ret = $("#Password").val().trim() == $("#Confirmpassword").val().trim();
- }
- return ret;
- },
- RequiredEmail: function(input) {
- var ret = true;
- if (input.is("[id=Email]")) {
- ret = $("#Email").val() != '';
- }
- return ret;
- }
- },
- messages: {
- PasswordRequired: "Please enter confirm password",
- PasswordLength: "Password must be of minimum 7 characters",
- CheckConfirmPassword: "Your passwords do not match",
- ConfirmPasswordRequired: "Please enter confirm password",
- RequiredEmail: "Email is required",
- }
- }).data("kendoValidator");
- if (validator.validate()) {
- alert("validation Success")
- $("#Uploadwindow").kendoWindow({
- content: {
- template: "<div class=\"form-inline\"><div class=\"col-lg-5\"><p>Please wait while we register your account. You will be redirected to home page automatically.</p></div>"
- },
- modal: true,
- width: 500,
- title: "User Registration"
- });
- uploadWindow.open();
- $.ajax({
- cache: false,
- async: false,
- type: "POST",
- url: "http://localhost:61832/api/MultiStepRegistrations",
- data: {
- FirstName: $("#fname").val(),
- LastName: $("#lname").val(),
- Email: $("#Email").val(),
- DOB: $("#Dob").val(),
- City: $("#City").val(),
- State: $("#State").val(),
- Country: $("#Country").val(),
- UserName: $("#UserName").val(),
- },
- success: function() {
- alert("Your Record Has Been Saved SuccessFully!");
- uploadWindow.close();
- window.location = SubmitURL;
- },
- error: function(xhr, status, error) {
- alert("This is inside Error function of Ajax Call For Update Event Function");
- }
- });
- }
- }
The registration form consists of three steps.
Step 1: Personal Details
In the browser it is as shown in Figure 6.
Figure 6
The Personal details validation is as shown in Figure 7.
Figure 7
The Personal details step with the data is as shown in Figure 8.

Figure 8
Step 2: Contact information
In the browser it is as shown in Figure 9.
Figure 9
The Contact information validation is as shown in Figure 10.
Figure 10
The Contact information with data is as shown in Figure 11.
Figure 11
Step 3: Login Information.
In the browser it is as shown in Figure 12.
Figure 12
The Login information validation is as shown in Figure 13.
Figure 13
The Login information confirm password validation is as shown in Figure 14.
Figure 14
Submitting the form is as shown in Figure 15.
Figure 15
Check the data in the database as shown in Figure 16.
Figure 16
That's it, enjoy coding.

Jithil JohnPosted Feb 15, 2016, 11:50 PM
Good One
Arul RPosted Oct 28, 2015, 5:57 AM
Nice share!!!
Sibeesh VenuPosted Jul 6, 2015, 3:18 AM
Good One.Thanks for sharing :)
SharadPosted Jul 6, 2015, 3:06 AM
Nice Article...
Debendra DashPosted Jul 6, 2015, 1:50 AM
Good one,,,,,,
RakeshPosted Jul 6, 2015, 1:16 AM
Good one
Debasis SahaPosted Jul 6, 2015, 12:57 AM
Good One
Santhakumar MunuswamyPosted Jul 6, 2015, 12:15 AM
Good work