ساخت فرم های Ajax در Asp.Net MVC
سه شنبه 30 تیر 1394در این مقاله با نحوه استفاده از 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 لیست اعضا به وسیله جاوا اسکریپت هدایت می شویم.در تصویر زیر نیز صفحه لیست کاربران را مشاهده می کنیم.
- ASP.net MVC
- 4k بازدید
- 7 تشکر