PDA

View Full Version : مشکل در کار با آزاکس و ارزیابی متغییرهای بدست آمده



aebrs@yahoo.com
جمعه 18 اسفند 1391, 20:38 عصر
من بر روی صفحه 3 منو کشور ، استان، شهر را دارم که با استفاده از جاوا و آژاکس به خوبی آنها را پر می کنم و با تغییر هر کدام منوی بعدی بر اساس انتخاب صورت گرفته به درستی پر می شود و مشکلی ندارم
اما زمانی که می خواهم صفحه کامل شده را ذخیره کنم با این خطا مواجه می شوم:

Invalid postback or callback argument


متوجه شده ام که این اشکال به خاطر تغییر در مقدار کد منو های قبلی است که در ابتدای بارگذاری صفحه توسط دات نت پر شده است. مثلا منو شهر برای شهر اول عدد 1 را گذاشته بوده است و حالا که استان عوض شده است عدد شهر 12 شده است. پس چون متغییر با آنچه در ابتدای در اصفحه یجاد شده تغییر کرده است و این تغییر در صفحه ثبت نشده است با این خطا مواجه می شوم.
راههای مختلف را بررسی کرده ام اما هنوز به نتیجه نرسیده ام. اگر دوستان کسی این تجربه را دارد و راه حل آنرا می داند ممنون می شوم راهنماوی کند
با تشکر

aebrs@yahoo.com
شنبه 19 اسفند 1391, 00:01 صبح
تذکر :
از این کد استفاده کردم ولی جواب نداده است

public class ListBoxNoEventValidation : ListBox
{
}

behrozi.ir
شنبه 19 اسفند 1391, 00:57 صبح
سلام
خطا میده یا ثبت نمیشه یا اینکه مقدار اشتباه ثبت میشه؟

aebrs@yahoo.com
شنبه 19 اسفند 1391, 01:01 صبح
Invalid postback or callback argument

aebrs@yahoo.com
شنبه 19 اسفند 1391, 01:22 صبح
از این کد هم استفاده کردم و جواب نداد:

protected override void Render(HtmlTextWriter writer)
{
if (IdOstan != null)
{
foreach (ListItem i in IdOstan.Items)
{
Page.ClientScript.RegisterForEventValidation(IdOst an.UniqueID, i.Value);
}
}
base.Render(writer);
}

behrozi.ir
شنبه 19 اسفند 1391, 01:39 صبح
از این کد هم استفاده کردم و جواب نداد:

protected override void Render(HtmlTextWriter writer)
{
if (IdOstan != null)
{
foreach (ListItem i in IdOstan.Items)
{
Page.ClientScript.RegisterForEventValidation(IdOst an.UniqueID, i.Value);
}
}
base.Render(writer);
}


از کوئری استرینگ تو صفحه استفاده کردی؟

aebrs@yahoo.com
شنبه 19 اسفند 1391, 01:44 صبح
خیر ابدا.:متفکر:

behrozi.ir
شنبه 19 اسفند 1391, 01:50 صبح
کدهای داخل PageLoad را بنداز داخل این کد

if (!Page.IsPostBack)
{CodeInsert Or Update}

aebrs@yahoo.com
شنبه 19 اسفند 1391, 10:13 صبح
یک لحظه شک کردم که شاید این موضوع را بررسی نکرده باشم (if (!Page.IsPostBack)) ولی اتفاقا این کار را هم چک کرده ام با وجود آنکه مشکل حل نمی شود ولی آنرا انجام داده ام اتفاقی که می افتد آنست که در بازسازی صفحه منو ها پر نمی شود و همچنان خطا باقی است
در کل دوست عزیز من می دانم مشکل کجاست و راه حل آن چیست و با این روشها قابل حل نیست. باید متغییرها به دات نت معرفی شود . فقط در اجرای آن مشکل دارم. اگر قبلا برخورد کرده باشید متوجه می شوید منظور و راه حل چیست!
موفق باشید

mRizvandi
شنبه 19 اسفند 1391, 12:11 عصر
دوست عزیز به نظر می آد سناریوی شما اشتباه باشه.
منظورت از منو همون dropdown هست؟
من تا حالا همچین چیزی ندیدم که مقدار dropdown در صفحه عوض بشه و ASP.NET بخواد جلوی اون رو بگیره، البته در Ajax منظورم هست.
سناریوی آپدیت کردن یا کد مربوط به dropdown و Ajax رو بذاری فکر کنم دوستان بهترن بتونن راهنمایی کنن

aebrs@yahoo.com
شنبه 19 اسفند 1391, 12:26 عصر
من نمونه ای که همین مشکل را دارد به همراه بانک آن را برای شما گذاشتم

نمونه آژاکس (http://hesab20.com/DownLoad/Ajax.zip)
بصورت متعارف کار با آژاکس مشکلی ندارد. مشکل زمانی است که از این روش برای پرکردن اشیاء استفاده بشود . بعد در هنگام کلیک با خطا مواجه خواهید شد. البته می توان EnableEventValidation="false" را استفاده کد اما این روش پاک کردن صورت مسئله هست
در حقیقت دات نت جلوی تغییر محتوای اشیاء را می گیرد زیرا می توان از آن طریق هک انجام داد. معمولا پیشنهاد می شود تا با استفاده از تابع Render تغییر محتوا را به سرور اطلاع داد. اما چگونه؟

mRizvandi
شنبه 19 اسفند 1391, 13:03 عصر
خب، من الان سورس رو اجرا کردم، به دیتابیس هم وصل شدم و dropdown اول پر شد
دومی که شهر بود رو هم انتخاب کردم و اون button رو زدم
حالا باید خطا می گرفتم یا کار دیگه ای باید انجام بدم که خطا بگیرم؟
button روی صفحه کدی نداره.

aebrs@yahoo.com
شنبه 19 اسفند 1391, 13:09 عصر
با کلیک وقتی پست بک انجام یم شود باید خطا بگیرد نیاز به کد کلیک ندارد

aebrs@yahoo.com
شنبه 19 اسفند 1391, 13:23 عصر
دقت کنید که EnableEventValidation="true" باشد اگر آنرا به false تبدیل کنید نباید خطا رخ دهد

na3er-faraji
شنبه 19 اسفند 1391, 13:50 عصر
ابتدا یک property جدید در page که قصد این کار را دارید به صورت زیر در بالای صفحه تعریف کنید

private string MyDropDownSelectedValue { get; set; }

سپس از کد زیر استفاده کنید

if(!IsPostBack)
{
//your code
}
else
{
MyDropDownSelectedValue = Request.Form[ddlMyDropDownName.UniqueID];
ddlMyDropDownName.SelectedValue = MyDropDownSelectedValue;
}

حالا در زمان ذخیره اطلاعات در بانک از این property یعنی MyDropDownSelectedValue به عنوان مقدار dropdown استفاده کنید.
ddlMyDropDownName رو با نام dropdown خودتون حتما تغییر بدید

aebrs@yahoo.com
شنبه 19 اسفند 1391, 14:10 عصر
با کمال تاسف کاری که شما گفتید انجام شد اما تغییری در مسئله رخ نداده است
خود شما هم می توانید نمونه کد را دانلود کنید و آنرا تست کنید
حتما کد EnableEventValidation="true" باشد
در این صورت با کلیک و انجام Postback با خطا مواجه خواهید شد :
Invalid postback or callback argument. Event validation is

ممنون

aebrs@yahoo.com
شنبه 19 اسفند 1391, 14:12 عصر
ایا توانستید مشکل را مشاهده کنید؟
آیا راه حلی دارید؟


خب، من الان سورس رو اجرا کردم، به دیتابیس هم وصل شدم و dropdown اول پر شد
دومی که شهر بود رو هم انتخاب کردم و اون button رو زدم
حالا باید خطا می گرفتم یا کار دیگه ای باید انجام بدم که خطا بگیرم؟
button روی صفحه کدی نداره.

na3er-faraji
شنبه 19 اسفند 1391, 14:19 عصر
ببخشید یک خط رو جا انداخته بودم که در کد بالا اصلاح کردم. دوباره تست کنید.

aebrs@yahoo.com
شنبه 19 اسفند 1391, 14:50 عصر
ببخشید یک خط رو جا انداخته بودم که در کد بالا اصلاح کردم. دوباره تست کنید.

من خواهش می کنم شما حتما کد نمونه را دانلود کنید و اجرا کنید تا خودتان مشکل را مشاهده کنید
صفحه اصلا برگشت داده نمی شود که بتواند به pageload برسد
:گریه:

na3er-faraji
شنبه 19 اسفند 1391, 15:09 عصر
روشی که گفتم کاملا درسته دوست من. الان نمونه شما رو هم تغییر دادم و کار کرد. اینجا براتون آپلودش کردم. فقط کانکشن استرینگ رو توی web.config تغییر دادم دوباره برگردونید به حالت اول برا خودتون.
موفق باشید
http://uploadtak.com/images/p4751_Ajax_2.zip

aebrs@yahoo.com
شنبه 19 اسفند 1391, 15:22 عصر
ممنون از اینکه وقت گذاشتید و روی این مطلب کار می کنید
من کد را دانلود کردم و اجرا کردم متاسفانه اگر این کد را تغییر بدهید مشاهده می کنید که خطا رخ می دهد :
EnableEventValidation="true"
اگر این گزینه false باشد کد خطا نمی دهد
باز هم از زحمت ووقت شما قدردانی می کنم


روشی که گفتم کاملا درسته دوست من. الان نمونه شما رو هم تغییر دادم و کار کرد. اینجا براتون آپلودش کردم. فقط کانکشن استرینگ رو توی web.config تغییر دادم دوباره برگردونید به حالت اول برا خودتون.
موفق باشید
http://uploadtak.com/images/p4751_Ajax_2.zip

mRizvandi
شنبه 19 اسفند 1391, 16:59 عصر
درسته در این حالت خطا میده.
شما با jQuery در سمت کلاینت داری دیتایی رو تغییر می دی که ASP.NET ازش خبردار نمیشه.
برای این کار باید سناریو رو تغییر بدی یا همون خصوصیت روی صفحه رو غیرفعال کنی. که اصلا پیشنهاد نمیشه.

این منبع رو مطالعه کن:
http://stackoverflow.com/questions/228969/invalid-postback-or-callback-argument-event-validation-is-enabled-using-page

من از تولزهای خود ASP.NET Ajax Tools استفاده می کنم. اگر به هیچ وجه جواب نگرفتید می تونید از Update Panle استفاده کنید.

na3er-faraji
شنبه 19 اسفند 1391, 17:25 عصر
کسی از دوستان با override کردن متد render این مشکل رو حل کرده تا حالا؟

meysamrt
یک شنبه 20 اسفند 1391, 17:18 عصر
یه نمونه کد گذاشتم. امیدوارم مشکلتون رو حل کنه

سورس کد

اسکریپت دیتابیس

aebrs@yahoo.com
یک شنبه 20 اسفند 1391, 17:32 عصر
به این کد که توسط مایکروسافت (http://msdn.microsoft.com/en-us/library/ms223395.aspx) ارائه شده نگاه کنید :

<%@ Page EnableEventValidation="true" Language="C#‎" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Register an option for event validation</title> <script runat="server"> protected override void Render(HtmlTextWriter writer) { ClientScript.RegisterForEventValidation("DropDownList1", "This is Option 1"); ClientScript.RegisterForEventValidation("DropDownList1", "This is Option 2"); ClientScript.RegisterForEventValidation("DropDownList1", "This is Option 3"); // Uncomment the line below when you want to specifically register the option for event validation. // ClientScript.RegisterForEventValidation("DropDownList1", "Is this option registered for event validation?"); base.Render(writer); } </script> <script type="text/javascript"> function Initialize() { var oOption = document.createElement("OPTION"); document.all("DropDownList1").options.add(oOption); oOption.innerText = "This is Option 1"; oOption = document.createElement("OPTION"); document.all("DropDownList1").options.add(oOption); oOption.innerText = "This is Option 2"; oOption = document.createElement("OPTION"); document.all("DropDownList1").options.add(oOption); oOption.innerText = "This is Option 3"; oOption = document.createElement("OPTION"); document.all("DropDownList1").options.add(oOption); oOption.innerText = "Is this option registered for event validation?"; } </script> </head> <body onload="Initialize();"> <form id="form1" runat="server"> <div> <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList> <asp:Button ID="Button1" runat="server" Text="Postback to server for validation" /> </div> </form> </body> </html>


در این کد اطلاعات در سمت کاربر اضافه شده است اما درست قبل از اجرا و در نتیجه همه احتمالات پیش بینی شده است در حالیکه این کار توسط آژاکس
خیلی وقتها ممکن نیست مثلا اگر بخواهیم همه شهرهای کشور را به سیستم معرفی کنیم

aebrs@yahoo.com
سه شنبه 22 اسفند 1391, 11:26 صبح
با تشکر از دوست عزیزم آقای مهندس خوشبخت بخاطر ارائه راه حل جایگزین، البته با توجه به آینکه مشکل توسط جی کوئری حل می شود باید راهکاری برای حل آن توسط کد جاوا اسکریپت هم وجود داشته باشد. در اینجا ضمن آنکه راه حل جدید را در پروژه اعمال کردم، مسئله را برای پیدا کردن راه حل همچنان باز نگه می دارم که اگر دوستان دیگری می خواهند با آن کلنجار بروند فرصت باشد

na3er-faraji
سه شنبه 22 اسفند 1391, 11:28 صبح
دوست من من دقیقا متوجه نشدم شما از کدوم روش بلاخره مشکل رو حل کردید؟ میشه توضیح بفرمایید؟

aebrs@yahoo.com
سه شنبه 22 اسفند 1391, 22:15 عصر
تا آنجا که در طول هفته گذشته دیده ام راه حلی در سایتهای فارسی و لاتین برای این مسئله پیدا نشده و همه جا دبون جواب باقی مانده است. حتی این نمونه کد که توسط آقای Rahul Singh (https://twitter.com/rahulrajatsingh/status/310684749796605952?uid=219698219&iid=7b56a89a-5eca-486d-863b-21bff1dcefe7&nid=27+234&t=1) در سایت Code Project نوشته شده است نیز راه حل مورد پسند و معقولی نداشت. می توانید پاسخ ایشان را در جواب شماره 2 (http://www.codeproject.com/Questions/559226/ErrorpluswithplusUsingplusXMLHttpRequestplusandplu ) مشاهده کنید. که استفاده از آپدیت پنل به نتیجه نرسید و روش دوم هم که نوعی بازی با کلمات بود. پس این مسئله لاینحل ماند تا بعد
اما من صورت مسئله را پاک کردم واز روش دوم که آنهم خوب است و توسط یکی از دوستان (meysamrt (http://barnamenevis.org/member.php?35457-meysamrt)) معرفی شده بود استفاده نمودم. در این روش از جی کوئری استفاده شده است. من ترجیح می دادم برای اینکار از کتابخانه جی کوئری استفاده نکنم وهمه کد را بنویسم. شاید وسواس بی خود باشد ولی به هر شکل ترجیح من است که به نتیجه نرسید پس فعلا تسلیم شدم و از روش دوم که استفاده از کتابخانه جی کوئری هست استفاده کردم. اشیاء روی صفحه را هم مانند آنجه در نمونه آروده شده عوض کردم و از اچ تی ام ال محض استفاده نمودم.
هنوز خوشحال هستم که مجبور نشدم از توابع آژاکس دات نت استفاده کنم یا آنکه در هر انتخاب پست بک کنم.
از پیگیری و وقت شما هم سپاسگذار هستم