ساخت فرم های Ajax در Asp.Net MVC

در این مقاله با نحوه استفاده از Ajax From ها در Asp.Net MVC را مشاهده خواهید کرد ، و با Redirect کردن توسط JavaScript آشنا خواهید شد.

 

در ابتدا کلاسی برای پاسخ گویی به درخواستی که به وسیله POST برای ما ارسال شده است ایجاد می کنیم، 

namespace AjaxForm.Serialization  
{  
    public class ResponseData<T>  
    {  
        public T Data { get; set; }  
        public string RedirectUrl { get; set; }  
        public bool IsSuccess { get { return this.Data == null; } }  
    }     
}  


برای پاسخ گویی به صورت Json باید ابتدا Newtonsoft.Json.5.0.8 را با nuget به پروژه اضافه کنیم تا بتوانیم با فرمت Json و داده های آن کار کنیم.

برای اینکار کافیست دستور زیر را از طریق Nuget Package Mannager Concole وارد کرده تا به پروژه افزوده Newtonsoft.Json.5.0.8 شود.

Install-Package Newtonsoft.Json

سپس کلاسی دلخواه برای ایجاد درخواست می نویسیم و کلاس را از کلاس JsonResult ارث بری می کنیم و سپس از طریق قطعه کد کلاس ایجاد شده را کامل می کنیم.

 

using Newtonsoft.Json;  
using Newtonsoft.Json.Serialization;  
using System;  
using System.IO;  
using System.Web;  
using System.Web.Mvc;  
  
namespace AjaxForm.Serialization  
{  
    public class JsonNetResult : JsonResult  
    {  
        public JsonNetResult()  
        {  
            Settings = new JsonSerializerSettings  
            {  
                ReferenceLoopHandling = ReferenceLoopHandling.Error,  
                ContractResolver = new CamelCasePropertyNamesContractResolver()  
            };  
        }  
  
        public JsonSerializerSettings Settings { get; private set; }  
  
        public override void ExecuteResult(ControllerContext context)  
        {  
            if (context == null)  
            {  
                throw new ArgumentNullException("context");  
            }  
            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))  
            {  
                throw new InvalidOperationException("JSON GET is not allowed");  
            }  
  
            HttpResponseBase response = context.HttpContext.Response;  
            response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;  
  
            if (this.ContentEncoding != null)  
            {  
                response.ContentEncoding = this.ContentEncoding;  
            }  
            if (this.Data == null)  
            {  
                return;  
            }  
            var scriptSerializer = JsonSerializer.Create(this.Settings);  
  
            using (var sw = new StringWriter())  
            {  
                scriptSerializer.Serialize(sw, this.Data);  
                response.Write(sw.ToString());  
            }  
        }  
    }  
}  

 

پس از آن اقدام به ایجاد کنترلر برای مدیریت و درخواست و پاسخ می کنیم و نام کنترلر را Base می گذاریم.

 

using AjaxForm.Serialization;  
using System.Linq;  
using System.Text;  
using System.Web.Mvc;  
  
namespace AjaxForm.Controllers  
{  
    public class BaseController : Controller  
    {  
        public ActionResult NewtonSoftJsonResult(object data)  
        {  
            return new JsonNetResult  
            {  
                Data = data,  
                JsonRequestBehavior = JsonRequestBehavior.AllowGet  
            };  
        }  
  
        public ActionResult CreateModelStateErrors()  
        {  
            StringBuilder errorSummary = new StringBuilder();  
            errorSummary.Append(@"<div class=""validation-summary-errors"" data-valmsg-summary=""true""><ul>");  
            var errors = ModelState.Values.SelectMany(x => x.Errors);  
            foreach(var error in errors)  
            {  
                errorSummary.Append("<li>" + error.ErrorMessage + "</li>");  
            }  
            errorSummary.Append("</ul></div>");  
            return Content(errorSummary.ToString());  
        }  
    }  
}

 

 

حال برای پیاده سازی Ajax Form ما اقدام به ایجاد یک کلاس جاوااسکریپت میکنیم و در آن کلاس اقدام به اعتبار سنجی و ارسال فرم از طریق POST می کنیم.

قطعه کد زیر کلاس جاوا اسکریپت مارا تشکیل می دهد : 
 

var Global = {};  
Global.FormHelper = function (formElement, options, onSucccess, onError) {      
    var settings = {};  
    settings = $.extend({}, settings, options);  
  
    formElement.validate(settings.validateSettings);  
    formElement.submit(function (e) {        
        if (formElement.valid()) {  
            $.ajax(formElement.attr("action"), {  
                type: "POST",  
                data: formElement.serializeArray(),  
                success: function (result) {  
                    if (onSucccess === null || onSucccess === undefined) {  
                        if (result.isSuccess) {  
                            window.location.href = result.redirectUrl;  
                        } else {  
                            if (settings.updateTargetId) {  
                                $("#" + settings.updateTargetId).html(result.data);  
                            }  
                        }  
                    } else {  
                        onSucccess(result);  
                    }  
                },  
                error: function (jqXHR, status, error) {  
                    if (onError !== null && onError !== undefined) {  
                        onError(jqXHR, status, error);  
                        $("#" + settings.updateTargetId).html(error);                         
                    }  
                },  
                complete: function () {  
                }  
            });  
        }  
        e.preventDefault();  
    });  
  
    return formElement;  
};  

 

حال اقدام به ایجاد یک کنترلر دیگر با نام User برای اضافه کردن کاربران و نمایش کاربران در درون لیست خواهیم کرد.کد زیر برای ایجاد کنترلر بکار می رود :
 

using AjaxForm.Models;  
using AjaxForm.Serialization;  
using System.Collections.Generic;  
using System.Web.Mvc;  
  
namespace AjaxForm.Controllers  
{  
    public class UserController : BaseController  
    {  
        public static List<UserViewModel> users = new List<UserViewModel>();  
  
        public ActionResult Index()  
        {  
            return View(users);  
        }  
  
        [HttpGet]  
        public ActionResult AddUser()  
        {  
            UserViewModel model = new UserViewModel();  
            return View(model);  
        }  
  
        [HttpPost]  
        public ActionResult AddUser(UserViewModel model)  
        {  
            if (ModelState.IsValid)  
            {  
                users.Add(model);  
                return NewtonSoftJsonResult(new ResponseData<string> { RedirectUrl = @Url.Action("Index", "User") });  
            }  
            return CreateModelStateErrors();  
        }  
    }  
} 

 

در کد زیر View مربوط به لیست اعضا را نگاه می کنید ، که نام آن Index.cshtml است :

 

@model List<AjaxForm.Models.UserViewModel>  
<div class="panel panel-primary">  
    <div class="panel-heading panel-head">User List</div>  
    <div class="panel-body">  
        <div class="btn-group">  
            <a id="addUser" href="@Url.Action("AddUser")" class="btn btn-primary">  
                <i class="fa fa-plus"></i> Add User  
            </a>  
        </div>  
  
        <table class="table table-striped">  
            <thead>  
                <tr>  
                    <th>UserName</th>  
                    <th>Email</th>  
                </tr>  
            </thead>  
            <tbody>  
                @foreach (var item in Model)  
                {  
                    <tr>  
                        <td>@item.UserName</td>  
                        <td>@item.Email</td>  
                </tr>  
                }  
            </tbody>  
        </table>  
    </div>  
</div> 

 

سپس شروع به ایجاد یک View برای اضافه کردن کاربر می کند : 
 

@model AjaxForm.Models.UserViewModel  
  
<div class="panel panel-primary">  
    <div class="panel-heading panel-head">Add User</div>  
    <div id="frm-add-user" class="panel-body">  
        @using (Html.BeginForm())  
        {  
            <div id="validation-summary"></div>  
            <div class="form-horizontal">  
                <div class="form-group">  
                    @Html.LabelFor(model => model.UserName, new { @class = "col-lg-2 control-label" })  
                    <div class="col-lg-9">  
                        @Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })   
                        @Html.ValidationMessageFor(model => model.UserName)                        
                    </div>  
                </div>  
                <div class="form-group">  
                    @Html.LabelFor(model => model.Email, new { @class = "col-lg-2 control-label" })  
                    <div class="col-lg-9">  
                        @Html.TextBoxFor(model => model.Email, new { @class = "form-control" })  
                        @Html.ValidationMessageFor(model => model.Email)                         
                    </div>  
                </div>                  
                <div class="form-group">  
                    <div class="col-lg-9"></div>  
                    <div class="col-lg-3">  
                        <button class="btn btn-success" id="btnSubmit" type="submit">  
                            Submit  
                        </button>  
                    </div>  
                </div>  
            </div>  
        }  
    </div>  
</div>  
  
@section scripts  
{  
    @Scripts.Render("~/bundles/jqueryval","~/Scripts/global.js","~/Scripts/user_add_user.js")  
}  

 

سپس فایلی برای جاوا اسکریپت می نویسیم به نام user_add_user.js و به پروژه اضافه می کنیم.
این فایل مقدار دهی اولیه را برای ایجاد یک تاییده و ارسال فرم از طریق POST آماده می کند.
کد های زیر را در فایل user_add_user.js قرار می دهیم و سپس آن را ذخیره می کنیم.


 

(function ($) {  
  
    function AddUser(){  
        var $this = this;  
  
        function initilizeUser() {  
            var formAddUser = new Global.FormHelper($("#frm-add-user form"), { updateTargetId: "validation-summary" })  
        }  
  
        $this.init = function () {  
            initilizeUser();  
        }  
    }  
    $(function () {  
        var self = new AddUser();  
        self.init();  
    })  
  
}(jQuery))

 

حالا شروع به اجرای پروژه می کنیم و صفحه AddUser را اجرا می کنیم.سپس در صفحه ایجاد شده شروع به وارد کردن مقادیر نمونه می کنیم.

سپس بر روی کلید اضافه کردن کاربر کلیک می کنیم و بعد از طریق کنترلر به صفحه یا View لیست اعضا به وسیله جاوا اسکریپت هدایت می شویم.در تصویر زیر نیز صفحه لیست کاربران را مشاهده می کنیم.

فایل های ضمیمه