PDA

View Full Version : حرفه ای: فرستادن json برای نمایش پیام به کاربر و رفرش کردن فرم



sh_esharif
جمعه 06 مرداد 1396, 11:55 صبح
دوستان عزیز سلام
در یک فرم Ajax اطلاعاتی به همراه فایلهایی که باید آپلود بشن قرار گرفته. بعد از فشردن دکمه ثبت، اطلاعات در جدول مربطه ذخیره میشوند. برای ثبت فایلهای آپلود شده چون قرم Ajax بود مجبور شدم از ajaxFileUpload استفاده کنم و در OnSuccess مربوط به Ajax.BeginForm تابع رو فراخوانی کنم. مشگل اینجاست که اطلاعات ثبت مشه و فایلهای آپلود شده هم ثبت ذخیره می شن و در این تابعی که فایلها رو ذخیره می کنه json برمیگرده تا به کاربر بگه اطلاعات با موفقیت ثبت شد.

تا اینجای کار درسته ولی بعدش اگه کاربر دوباره دکمه ثبت رو بزنه خطای " ... Store update, insert, or delete statement affected an unexpected " داده میشه و نیاز هست فرم Ajx من دوباره رفرش بشه.
میشه کمک کنید چه جوری هم به کاربر پیام نشون بدم هم فرم رو رفرش کنم؟
از Entity Framework استفاده می کنم ولی برای ذخیره اطلاعات class library نوشته شده که سورش رو ندارم. یعنی وقتی ذخیره میزنم به context مستقیما دسترسی ندارم که راهکاری که دوستان برای این خطا گفتن رو پیاده سازی کنم.

خواهش می کنم کمک کنید. ممنون.

Cybersilent
جمعه 06 مرداد 1396, 12:10 عصر
چیزی که مشخصه اینه که خطا مربوط به SQL می باشد که هنگام ذخیره اطلاعات رخ می دهد.
فکر می کنم فرم شما هنگامی که اطلاعات بار اول پست می شود با هنگامی که برای بار دوم پست می شود تفاوت هایی می کند، مثلا یک Id خارجی در فرم دارید که بعد از ثبت و نمایش پیغام از صفحه حذف می شود یا کلا آیدی غیر معتبر می باشد.
یگ حالت دیگه هم وجود مشکل در پیاده سازی های EntityFramework هست که عیب یابی اون بدون داشتن اطلاعات بیشتر از پروژه تون میسر نیست

RIG000
جمعه 06 مرداد 1396, 13:23 عصر
دوستان عزیز سلام
در یک فرم Ajax اطلاعاتی به همراه فایلهایی که باید آپلود بشن قرار گرفته. بعد از فشردن دکمه ثبت، اطلاعات در جدول مربطه ذخیره میشوند. برای ثبت فایلهای آپلود شده چون قرم Ajax بود مجبور شدم از ajaxFileUpload استفاده کنم و در OnSuccess مربوط به Ajax.BeginForm تابع رو فراخوانی کنم. مشگل اینجاست که اطلاعات ثبت مشه و فایلهای آپلود شده هم ثبت ذخیره می شن و در این تابعی که فایلها رو ذخیره می کنه json برمیگرده تا به کاربر بگه اطلاعات با موفقیت ثبت شد.

تا اینجای کار درسته ولی بعدش اگه کاربر دوباره دکمه ثبت رو بزنه خطای " ... Store update, insert, or delete statement affected an unexpected " داده میشه و نیاز هست فرم Ajx من دوباره رفرش بشه.
میشه کمک کنید چه جوری هم به کاربر پیام نشون بدم هم فرم رو رفرش کنم؟
از Entity Framework استفاده می کنم ولی برای ذخیره اطلاعات class library نوشته شده که سورش رو ندارم. یعنی وقتی ذخیره میزنم به context مستقیما دسترسی ندارم که راهکاری که دوستان برای این خطا گفتن رو پیاده سازی کنم.

خواهش می کنم کمک کنید. ممنون.
منم با پاسخ دوستمون که گفتن مربوط به Id میتونه باشه موافقم. شما برای اولین بار دارید صفحه رو لود می کنید و همه چی درست کار میکنه ... Id مربوطه به Current Entity‌و NavigationPRoperty چگونه هست؟ این ها رو چک کنه. Id در سمت BackEnd اگر ایجاد میشه پس فکر نکنم مشکلی باشه و شما به ازاری هر درخواست میتونید یک سطر جدید ایجاد کنید. اما اگر میخاید Modified بشه که باید کل اطلاعات رو از دیتابیس برگردونید که Id ها اینجا مهم هستن که باید کل دیتا ها باشه . مثال : ممکن هست شما NavigationPropery دارید که اون داره به خطامیخوره... دیتاهایی که دارید ارسال میکنید رو در دفعه اول با دفعات بعد که به خطا میخوره مقایسه کنید. این راه میتونه کمک کنه که چه اتفاقی داره می افته

sh_esharif
جمعه 06 مرداد 1396, 14:42 عصر
ممنون از پاسخ شما دوستان عزیز.
این فرم من گرید نیست یه سری textbox هست که پر میشه.
فرمایش شما کاملا درسته. وقتی فرم پر میشه و ارسال میشه عمل add صورت میگیره و Id صفره. دفعه ی دوم باید عمل آپدیت صورت بگیره در اینجا چون این اطلاعات ارتباط یک به یک با یک جدول دیگه داره و کلید خارجیه یعنی خودم کلید اصلی رو ست می کنم Id رو دارم ولی این Id از model که پارامتر متد ثبت هست و اطلاعات فرم رو داره نیومده چون فرم رفرش نشده و توی فرم Id همچنان صفره. اگه بعد از اولین ثبت کلید F5 رو بزنم درست کار میکنه چون فرم دوباره لود میشه. من باید بعد از اینکه به کاربر نشون میدم اطلاعات با موفقیت ثبت شده متد Index رو که با باز شدن فرم فراخوانی میشه فراخوانی کنم که نمی دونم چه جوریه.
حتی اگه در ویرایش در متد ثبت کل اطلاعات این Id رو دیتابیس بخونم باز هم همین خطا میده.

RIG000
جمعه 06 مرداد 1396, 16:36 عصر
ممنون از پاسخ شما دوستان عزیز.
این فرم من گرید نیست یه سری textbox هست که پر میشه.
فرمایش شما کاملا درسته. وقتی فرم پر میشه و ارسال میشه عمل add صورت میگیره و Id صفره. دفعه ی دوم باید عمل آپدیت صورت بگیره در اینجا چون این اطلاعات ارتباط یک به یک با یک جدول دیگه داره و کلید خارجیه یعنی خودم کلید اصلی رو ست می کنم Id رو دارم ولی این Id از model که پارامتر متد ثبت هست و اطلاعات فرم رو داره نیومده چون فرم رفرش نشده و توی فرم Id همچنان صفره. اگه بعد از اولین ثبت کلید F5 رو بزنم درست کار میکنه چون فرم دوباره لود میشه. من باید بعد از اینکه به کاربر نشون میدم اطلاعات با موفقیت ثبت شده متد Index رو که با باز شدن فرم فراخوانی میشه فراخوانی کنم که نمی دونم چه جوریه.
حتی اگه در ویرایش در متد ثبت کل اطلاعات این Id رو دیتابیس بخونم باز هم همین خطا میده.
شما اطلاعات رو که میبری ثبت کنی .. ۱-مطمن میشی که ثبت شده در پشت صحنه ... و سپس بر اساس الگویی که برای برگشتن همون رکورد در نظر گرفته که مثلا بعد از ذخیره شدن خودش برگردونده شه یا نه میای مجدد با id مربوطه لودش میکنی... در هر دو حالت اطلاعات رو میگیری و به طور json در success درخواست خودت میگیریش. و id مربوطه رو به باکس مورد نظر set کن بعد از گرفتنش در success . این نمونه رو ببین. (https://stackoverflow.com/questions/42764099/mvc-ajax-return-partial-view-with-model-get-the-value-of-model-in-the-success)

sh_esharif
جمعه 06 مرداد 1396, 22:24 عصر
جناب RIGOOO ممنون از جوابتون.
چون متد ثبت من اول اجرا میشه بعد متد ذخیره ی فایلهای ضمیمه و بعد در متد ذخیره فایلهای ضمیمه json برمیگرده دیگه به اطلاعات مدل که پارامتر متد ثبت است دسترسی ندارم.
با جوابی که دادید یه راهی به ذهنم رسید که انجام دادم و درست شد.

در تابع ajaxFileUpload در قسمت success یه تابع دیگه فراخوانی کردم که پیام رو به کاربر نشون میده و بعد از چند ثانیه با اجرای متد post جی کوئری، متد add که partialView برمی گردونه رو صدا میزنه و حاصل رو html بخش div قرار میده که اون قسمت از فرم رو احاطه کرده.

بازم ممنون از راهنمایی هاتون.
موفق باشید.