مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

ali-farzin

عضویت از 1393/05/11

Bootstrap Modal و مشکل نمایش خطاهای Validation

  • دوشنبه 4 آبان 1394
  • 17:17
تشکر میکنم

با سلام

طبق آموزش استاد bootstrap modal پیاده‌سازی شده است.  به این ترتیب که Index View در حالت معمولی و کلیه Viewهای دیگر (شامل Create، Edit، Details و Delete) در حالت modal باز می‌شوند و به خوبی کار می‌کنند.

به دلیل مسائل امنیتی و نااطمینانی اعتبارسنجی سمت کلاینت، اعتبارسنجی مقادیر ورودی را سمت سرور (یعنی در اکشن مربوط به postback) انجام می‌دهم.  می‌دانیم که طبق این مدل از اعتبار سنجی، وقتی که یا Postback شدن ویوهای Edit و Create مقدار ModelState حاوی خطا می‌شود، اکشن مجدداً به همان ویو برمی‌گردد و خطاهای هر یک از propertyها را نمایش می‌دهد.

و اما مشکل:

وقتی ویوی Edit را در حالت modal نمایش داده‌ام، نمایش مجدد این ویو همراه با خطاهای مربوط به هر پراپرتی در همان حالت یک پنجره modal روی ویوی index چگونه است؟

با تشکر و سپاس

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • دوشنبه 4 آبان 1394
  • 17:35

شما برای انجام اینکار باید از Ajax.BeginForm استفاده کنید

ایجاد و نمایش داده با استفاده از AjaxBegin Form در MVC

کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • پنجشنبه 7 آبان 1394
  • 17:53

با سلام

مثال خوبی بود و مشکل اصلی را برطرف کرد ولی یک مشکل کوچک دیگه ظاهر شد.

مشکل جدید اینه که وقتی فرم ایجکسی به سمت کنترولر رفت و اعتبارسنجی مقادیر با خطا مواجه شد با وجود آنکه 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 هیچگاه رخ نمی‌دهد.

علتش را نتونستم متوجه بشم؟

کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • شنبه 9 آبان 1394
  • 12:16

حل این مشکل، یک گام دیگه هم پیش رفت ولی نمی‌دانم چرا باز هم مساله داره !!!

این جوری متوجه شدم که مقدار ModelState.IsValid هیچ ارتباطی به OnSuccess و یا OnFailure نداره.  در واقع باید خودمون این به اش بفهمونیم و یکی از راههایی که در

http://stackoverflow.com/questions/7328977/asp-net-mvc-ajax-beginform-executes-onsuccess-even-though-model-is-not-valid

پیدا شد این است که وضعیت ModelState را با JSON برگردونیم.   این روش را در نمونه کد معرفی شده استاد مدائنی و در کنترولر UsersNew پیاده‌سازی شد که پیوست است ولی مشکل جدید اینه که هر وقت ورود اطلاعات به مشکل ولیدیتی برخورده و پس از رفع اشکال به مرحله ذخیره اطلاعات در دیتابیس برسه، رکورد دو مرتبه به تکرار ثبت می‌شود.

 

اسکریپت ساخت دیتابیس و جدول

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

 

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

کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • سه شنبه 12 آبان 1394
  • 10:58

راه‌حل رفع مشکل تکرار در ذخیره اطلاعات فرم 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

 

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)