پیشگیری از اجرای مجدد رخ دادها هنگام رفرش کردن صفحه


مسئله: یک صفحه داریم که روی اون یک دکمه وجود دارد که وقتی روی دکمه کلیک میشه صفحه PostBack میشه و بعضی کارها انجام میشه. اما اگر یک بار این دکمه را فشار دهیم و بعد از اینکه کارهای ما درون صفحه انجام شد، صفحه رو رفرش کنیم، مجددا رویدادگردان مربوط به دکمه اجرا میشه و اطلاعات ما باز هم ثبت میشه. یعنی با اینکه ما صفحه را رفرش میکنیم ولی باز هم صفحه PostBack میشود و تمامی کار های مربوط به آخرین روالی که صفحه راPostBack کرده مجددا اجرا میشود. این اتفاق در زمانی که اطلاعات حساسی در صفحه ثبت میشود بسیار دردسرساز است.
راه حل: باید به وسیله کدی که سمت کلاینت و سرور وجود دارد و چک کردن این کد، رویداد گردانی را فعال یا غیر فعال کرد. قطعه کد این راه حل را مشاهده میکنید.
public string ClientCode
    {
        get
        {
            return ViewState["ClientCode"] != null ? ViewState["ClientCode"].
                   ToString(): string.Empty;            
        }
        set
        {
            ViewState["ClientCode"] = value;
        }
    }
    public string ServerCode
    {
        get
        {
            return Session["ServerCode"] != null ?  Session["ServerCode"].
                   ToString() : string.Empty;
        }
        set
        {
            Session["ServerCode"] = value;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {

        PreventUnexpectedRePost();
    }

    private void PreventUnexpectedRePost()
    {                       
        if (!IsPostBack || ClientCode.Equals(ServerCode))
        {
            string code = Guid.NewGuid().ToString();
            ClientCode = code;
            ServerCode = code;
        }
        else
        {           
            Response.Redirect(Request.Url.ToString());
        }
    }

در این کد متغیر های ServerCode و ClentCode کدها را نگه داری میکندد و تابع PreventUnexpectedRePost مسئولیت پیشگیری از اجرای مجدد رویداد گردان را دارد.
در صورت نیاز میتوان این کد را در BasePage یا MasterPage قرار داد که در تمامی صفحات سایت اعمال شود.
ممکن است کاربر چندین صفحه از سایت را باز کند که در این صورت سرور کد و کلاینت کد همخوانی خود را از دست خواهد داد. برای رفع این مشکل میتوان به ازای هر صفحه یک مقداد را درون یک Dictionary قرار داد.
پ ن: این خبرنامه هایی که آدم عضو آنها میشه هر از چند گاهی میتونه مشکلات آدم رو حل کنه. :-)

0 نظرات: