با سلام
طبق آموزش استاد bootstrap modal پیادهسازی شده است. به این ترتیب که Index View در حالت معمولی و کلیه Viewهای دیگر (شامل Create، Edit، Details و Delete) در حالت modal باز میشوند و به خوبی کار میکنند.
به دلیل مسائل امنیتی و نااطمینانی اعتبارسنجی سمت کلاینت، اعتبارسنجی مقادیر ورودی را سمت سرور (یعنی در اکشن مربوط به postback) انجام میدهم. میدانیم که طبق این مدل از اعتبار سنجی، وقتی که یا Postback شدن ویوهای Edit و Create مقدار ModelState حاوی خطا میشود، اکشن مجدداً به همان ویو برمیگردد و خطاهای هر یک از propertyها را نمایش میدهد.
و اما مشکل:
وقتی ویوی Edit را در حالت modal نمایش دادهام، نمایش مجدد این ویو همراه با خطاهای مربوط به هر پراپرتی در همان حالت یک پنجره modal روی ویوی index چگونه است؟
با تشکر و سپاس
شما برای انجام اینکار باید از Ajax.BeginForm استفاده کنید
با سلام
مثال خوبی بود و مشکل اصلی را برطرف کرد ولی یک مشکل کوچک دیگه ظاهر شد.
مشکل جدید اینه که وقتی فرم ایجکسی به سمت کنترولر رفت و اعتبارسنجی مقادیر با خطا مواجه شد با وجود آنکه ModelState.IsValid دارای مقدار false است ولی بازهم OnSuccess هم اجرا میشود.
برای درک بهتر کار، دستور را به شکل زیر تغییر دادم تا زمان وقوع رویدادها را کنترل کنم.
@using (Ajax.BeginForm("Create", "Users", FormMethod.Post, new AjaxOptions() { UpdateTargetId = "list", InsertionMode = InsertionMode.Replace, OnBegin = "alert('OnBegin')", OnComplete = "alert('OnComplete')", OnFailure = "alert('OnFailure')", OnSuccess = "alert('OnSuccess')" }))
جالب اینکه OnSuccess در تمام حالات رخ میدهد و کاری به ModelState ندارد ولی OnFailure هیچگاه رخ نمیدهد.
علتش را نتونستم متوجه بشم؟
حل این مشکل، یک گام دیگه هم پیش رفت ولی نمیدانم چرا باز هم مساله داره !!!
این جوری متوجه شدم که مقدار ModelState.IsValid هیچ ارتباطی به OnSuccess و یا OnFailure نداره. در واقع باید خودمون این به اش بفهمونیم و یکی از راههایی که در
اسکریپت ساخت دیتابیس و جدول
USE [master] GO CREATE DATABASE [AjaxBeginForms] ON PRIMARY ( NAME = N'AjaxBeginForms', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AjaxBeginForms.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'AjaxBeginForms_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AjaxBeginForms_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO USE [AjaxBeginForms] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Users]( [UserID] [int] IDENTITY(1,1) NOT NULL, [UserName] [nvarchar](500) NOT NULL, [UserFamily] [nvarchar](500) NULL, CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [UserID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
راهحل رفع مشکل تکرار در ذخیره اطلاعات فرم modal
در ویوهایی که به شکل modal نمایش داده میشوند، پس از Validation در کنترولر HttpPost، اگر مقدار ModelState.IsValid معادل false بود باید یک PartialView به جای View پاس داده شود.
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Users users) { if (ModelState.IsValid) { db.Users.Add(users); db.SaveChanges(); return Json(new { redirectTo = Url.Action("Index", "UsersNew") }); } //return View(users); return PartialView(users); }
منبع:
http://stackoverflow.com/questions/4062568/form-submitted-twice-after-updating-from-asp-mvc-3-preview-to-beta
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)