من در پروژه در View و Controller از این کدها استفاده کردم ولی وقتی پیام را در تابع Onsuccess نشان میدهد به یک صفحه دیگر میرود یعنی در همان صفحه این پیام را نشان نمی دهد
,و بعد از نشان دادن پیام به صفحه دیگری میرود ولی من میخوام پیام را در همان صفحه ای که هست نشان دهد مشکل از چیه ؟
.........................................View.................................
@using (Ajax.BeginForm("Create", "Forces", new AjaxOptions { UpdateTargetId = "ajaxshow", LoadingElementId = "gifloading", InsertionMode = InsertionMode.Replace, OnSuccess = "OnSuccess", OnFailure = "OnFailure" }
.........................................JavaScript.................................
<script type="text/javascript"> function OnSuccess() { swal("ثبت شد", "", "success"); } function OnFailure() { swal("ثبت نشد", "", "error"); } </script>
.........................................Controller.................................
if (ModelState.IsValid) { //bool existsforce = db.Forces.Any(f => f.NameForce.Equals(force.NameForce) && f.FamilyForce.Equals(force.FamilyForce)); bool existscodebsj = db.Forces.Any(c => c.CodeForce.Equals(force.CodeForce)); if (existscodebsj) { return Json(new { success = false }, JsonRequestBehavior.AllowGet); } else { db.Forces.Add(force); db.SaveChanges(); ModelState.Clear(); return Json(new { success = true }, JsonRequestBehavior.AllowGet ); } } return Json(force);
ابتدا مطمعن شوید مقادیر UpdateTargetId و LoadingElementId را به درستی وارد کرده اید و همچنین نیاز نیست success را بازگردانی کنید. OnSuccess موفق بودن درخواست را بررسی می کند نه مقدار بازگردانی شده.
را حل این است که چند پارامتر توسط تابع onsuccess دریافت کنیم:
@using (Ajax.BeginForm("Create", "Forces", new AjaxOptions { UpdateTargetId = "ajaxshow", LoadingElementId = "gifloading", InsertionMode = InsertionMode.Replace, OnSuccess = "OnSuccess(message, status)", OnFailure = "OnFailure" }
function OnSuccess(message, status) { if(status){ swal(message, "error"); }else{ swal(message, "success"); } }
if (db.Forces.Any(c => c.CodeForce.Equals(force.CodeForce))) { return Json(new { message = "قبلا ثبت شده است", status = false }, JsonRequestBehavior.AllowGet); } else { db.Forces.Add(force); db.SaveChanges(); ModelState.Clear(); return Json(new { message = "با موفقیت ثبت شد", status = true }, JsonRequestBehavior.AllowGet ); }
پیشنهاد من این است که از AjaxOptions.OnComplete استفاده کنید.
چون براساس مقدار بازگردانی شده میتوان پیغامی مناسب نمایش داد، onSeccess تنها موفقیت آمیز بود درخواست را بررسی می کند.
ممنون از پاسختون ولی با این روش رفتم ولی دیگه پیام رو نشون نمیده ولی در آخر به صفحه دیگه میره
البته UpdateTargetId و LoadingElementId در Layout سایت هستند
خصوصیت زیر را به AjaxOptions اضافه کنید:
InsertionMode = InsertionMode.Replace,
داره همچین خصوصیتی
میشه یه مثال با OnComplete بنویسید
تفاوتی نداره فک کنم همون Onsucces هارو Complete می نویسیم درسته ؟؟
تنها کافی است نام چند تابع را تغییر دهید و پس از OnCompelete را مقدار دهی کنید.
@using (Ajax.BeginForm("Create", "Forces", new AjaxOptions { UpdateTargetId = "ajaxshow", LoadingElementId = "gifloading", InsertionMode = InsertionMode.Replace, OnCompelete = "OnCompelete(message, status)"" }
با این روش میشه جایگزینش روش بالا رفت ؟
$.ajax({ type: "POST", url: "/Controller/Action", // the URL of the controller action method data: null, // optional data success: function(result) { // do something with result }, error : function(req, status, error) { // do something with error } });
بله می شود; مستندات : jQuery.ajax() | jQuery API Documentation
کلا با هر روشی برم به صفحه جدید دیگه میره
چرا ؟؟؟؟؟؟؟؟
@using (Ajax.BeginForm("Create", "Forces", new AjaxOptions { UpdateTargetId = "ajaxshow", LoadingElementId = "gifloading", InsertionMode = InsertionMode.Replace, OnComplete="OnSuccess" }
<script type="text/javascript"> function OnSuccess(message, status) { if (status) { swal(message, "error"); } else { swal(message, "success"); } } </script>
if (ModelState.IsValid) { //bool existsforce = db.Forces.Any(f => f.NameForce.Equals(force.NameForce) && f.FamilyForce.Equals(force.FamilyForce)); bool existscodebsj = db.Forces.Any(c => c.CodeForce.Equals(force.CodeForce)); if (existscodebsj) { return Json(new { message = "قبلا ثبت شده است", status = false }, JsonRequestBehavior.AllowGet); } else { db.Forces.Add(force); db.SaveChanges(); ModelState.Clear(); return Json(new { message = "با موفقیت ثبت شد", status = true }, JsonRequestBehavior.AllowGet); } } return Json(force);
با این روش دیگه پیام رو هم نشون نمیده
بعد از ارسال
$.ajax({ type: "POST", url: "/Controller/Action", // the URL of the controller action method data: null, // optional data success: function(result) { // do something with result }, error : function(req, status, error) { // do something with error } });با این روش اگه بخواهم برم
پارامتر ها را وارد نکرده اید:
OnComplete="OnSuccess(message,status)"
گذاشتم
بعد console.log هم گذاشتم بببینم داخل متد Oncomplete میره که اصلا نمیره داخل متد
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)