PDA

View Full Version : گفتگو: ایجاد Page جدید یا استفاده از MultiView



hamedsabzian
پنج شنبه 20 خرداد 1389, 04:40 صبح
با سلام خدمت دوستان عزیز!
هدف از این تاپیک، بحث و گفتگو در باره ی معیارهای تصمیم گیری برای افزودن Page جدید یا استفاده از MultiView برای انجام کارهاست.
حتما به موارد استفاده از MultiView برخوردید.
دوستان لطف کنند: آموخته ها، تجربیات و نظراتشون رو در این باره قرار بدن.
فکر می کنم بحث حول موارد زیر در شرایط مختلف، برای شروع بد نباشه:
1. سرعت لود صفحه (اولین کامپایل، PostBack ها)
2. امنیت ارسال پارامترها بین صفحات
3. باز هم سرعت لود صفحه (وقتی با کنترل های داده ای کار می کنیم)
...
اگه مورد دیگه ای هم بود بفرمایید!

hamedsabzian
پنج شنبه 20 خرداد 1389, 13:01 عصر
برای شروع یک مثال از استفاده از MultiView می زارم. (و البته کمی کار با اسناد XML)
دوستان خواهش می کنم نظر بدید!

hamedsabzian
پنج شنبه 20 خرداد 1389, 17:04 عصر
انجام همان اعمال قبلی هم با استفاده از MultiView و هم با استفاده از دو Page جداگانه.
به نظرتون کدوم بهینه تره؟

aminghaderi
پنج شنبه 20 خرداد 1389, 17:24 عصر
MultiView یه گزینه خوب و در عین حال کم مصرف هست (من زیاد ندیدم کسی کار کنه)


1. سرعت لود صفحه (اولین کامپایل، PostBack ها)
2. امنیت ارسال پارامترها بین صفحات
3. باز هم سرعت لود صفحه (وقتی با کنترل های داده ای کار می کنیم)
...
سرعت لود صفحه به نظر من بسته به طراحی داره و سیستم کش هم برای بعضی صفحات سنگین خوبه.
البته راه هایی دیگر هم هست.
امنیت ارسال پارامتر ها رو میشه کنترل کرد ، درسته یه مقدار فشار به سرور می یاد ولی می شه درست کرد.
کنترل های داده رو متوجه نشدم ، منظور چی بود؟!
خاطرم هست اوایل کار با asp می خواستم از این گزینه استفاده کنم ولی به دلیل مشکلاتی که پیش اورد و متاسفانه خاطرم نیست ، مجبور شدم از چرخه طراحی حذفش کنم.

موفق باشید.

iman_ad
پنج شنبه 20 خرداد 1389, 18:16 عصر
گزینه مناسبی است
تا زمانی که تو ویوی اکتیو هستی هیچ کدوم از کنترهای داخل باقی اونتها اونتهاشون حتی لود نمی شه و قاعدتا رندر هم نمی شن برای تبادل اطلاعات بین ویوها باید از هدین فیلد خارخ از مالتی ویو یا ویو استیت استفاده کنی

hamedsabzian
پنج شنبه 20 خرداد 1389, 18:29 عصر
ممنون از توجهتون!
صفحه ای که حجم کد بالایی داره (چه MultiView باشه و چه نباشه) در مرحله ی اول که تبدیل به کد میانی میشه و سپس کد HTML، کنده و کندیش محسوس!
بعد فکر نمی کنم برای صفحه ای که توش MultiView هست Caching در سطح کد HTML خیلی جواب بده! (چون به صورت پیشفرض یکی از View ها فعال هست).
منظور از کنترل های داده ای: وجود Grid یا ... در View های مختلف.

شخصا خیلی از این کنترل استفاده می کنم!
ولی ... یه مثال می زنم:
1. فرض کنید توی View اول (V1) یک GridView گذاشتیم که مثلا 50 رکورد رو نمایش بده.
2. توی V2 یک Grid دیگه وجود داره که اطلاعات مربوط به رکورد انتخابی از Grid واقع در V1 رو نشون میده.
3. و توی V3 اطلاعات رکورد انتخابی ازGrid واقع در V1 رو می تونیم ویرایش کنیم.
و ...

حالا کاربر:
1. ابتدا V1 رو با 50 رکورد می بینه.
2. V2 رو با 30 رکورد.
3.... در نهایت توی V3 مشغول ویرایش داده ها می شه که این ویرایش 5 دقیقه طول میکشه.

(به نظرتون در این حالت سرعت PostBack ها چجوریه؟)
مزیتش اینه که کاربر راحت به اطلاعات بقیه View ها دسترسی داره.
عیبش اینه که موقعی که کاربر داره ویرایش رو انجام میده اطلاعات دوتا Grid دیگه توی سرور هستن.
(البته این برام سواله که وقتی یه Grid بایند میشه، اطلاعات مربوطه سمت سرور نگه داری میشن یا اینکه ...)
به هر حال ...

اگه از چند Page استفاده بشه هم مشکل ارسال پارامترها رو داریم که در نهایت مجبوریم از حافظه ی سرور استفاده کنیم.

هر جا مشکل دار گفتم، اصلاح کنید!

hamedsabzian
پنج شنبه 20 خرداد 1389, 18:36 عصر
گزینه مناسبی است
تا زمانی که تو ویوی اکتیو هستی هیچ کدوم از کنترهای داخل باقی اونتها اونتهاشون حتی لود نمی شه و قاعدتا رندر هم نمی شن برای تبادل اطلاعات بین ویوها باید از هدین فیلد خارخ از مالتی ویو یا ویو استیت استفاده کنی

درسته ولی با توجه به پست قبل که یک بار اطلاعات در View های دیگه Load شده چی؟
توی V3 میتونید به اطلاعات V1 دسترسی داشته باشید، نیازی به HiddenField نیست! بعد هم ممکنه امنیت پارامترها هم برامون مهم باشه و نخوایم اونارو بفرستیم سمت کاربر.

iman_ad
پنج شنبه 20 خرداد 1389, 19:35 عصر
چه ربطی به حافظه سرور داره وب فرم stateless هستش و بعد از رندر شدن صفحه مرگ کنترل page فرا می رسه البته خیلی ساده گفتم
برای دیدن جزییات می تونید این لینک مطالعه کنید.
اینکه بعد از لود یک ویو می شه به مقادیر کنترهای ویوهایی که یک بار لود سدن دسترسی داشت به حفظ حالت کنترها بر می گرده که باری روی سرور نیست روی صفحه ذخیره می شه و روری حجم صفحه کلاینت تاثیر داره اگه مشکلی داری باهاش حفظ حالت کنترلاتو فالس کن
http://msdn.microsoft.com/en-us/library/ms178472.aspx

اوبالیت به بو
پنج شنبه 20 خرداد 1389, 20:07 عصر
سلام

فرض کنید که می خواید با بانک اطلاعاتی کار کنید. به ازای هر Table یا موجودیت 5 تا متد اصلی داریم.

سناریو1: بیایم به ازای هر متد یک Page بسازیم!!
سناریو2: از MultiView استفاده کنیم.

شخصاً به MultiView علاقه بسیاری دارم.

hamedsabzian
پنج شنبه 20 خرداد 1389, 20:27 عصر
OK! پس همه چی سمت کاربر ارسال میشه!
یعنی اگه به طور مثال، ViewState کل صفحه رو برابر False قرار بدم، به اطلاعات View های دیگه دسترسی ندارم؟ آیا این به این معنی است که اطلاعات (حتی مقادیر داده ای) به صورت کامل در ViewState ذخیره میشه؟

iman_ad
پنج شنبه 20 خرداد 1389, 22:38 عصر
هر چیزی که در پست بک بعدی قابل بازیابی باشه بله در viewstate ذخیره می شه.
بازم تاکید می کنم asp.net بر اساس domain application کار می کنه و کاملا stateless می باشد.

aminghaderi
جمعه 21 خرداد 1389, 01:49 صبح
تاکید می کنم ASP.NET بر اساس domain application کار می کنه و کاملا stateless می باشد.
حالا این گزینه ها چی هستند؟؟؟
ممنون می شم توضیح بدی؟؟

hamedsabzian
جمعه 21 خرداد 1389, 03:56 صبح
خوب برگردیم سر موضوع اصلی:
با این تفاسیر اگر درون View ها کنترل های داده ای با حجم اطلاعات زیاد وجود داشت که یه بار Load شدن و الان ما با View های دیگه مار می کنیم، بهتر ViewState اونارو بیخیال بشیم تا سرعت PostBack ها پایین نیاد.
اما اگه بخوایم ViewState رو بیخیال بشیم با مشکلات دیگه ای مواجه ایم. به عنوان مثال ما در View جاری نیاز به استفاده از اطلاعات موجود در View های دیگه داریم. که همون طوری که جناب iman_ad گفتن می تونیم پارامتر های مورد نیاز رو توی HiddenField بریزیم که نهایتا بره سمت سرور و برگرده. یا اینکه این اطلاعات رو توی Session ذخیره کنیم، که با توجه به سرباری که برای سرور میاره و اینکه ممکنه این اطلاعات کم هم نباشن، باید سعی کنیم کمتر این کار رو بکنیم. البته گاهی اوقات محرمانگی داده ها برامون خیلی مهمتره!
خوب برای این قسمتش می تونیم یه راه حل بدیم:
Hash (مثلا SHA1) داده هایی رو که میخوایم بفرستیم سمت کاربر محاسبه کنیم و یه کلید برای رمزنگاری متقارن هم تولید کنیم، Hash رو به انتهای داده اضافه کرده و حاصل رو با کلید رمز کنیم (مثلا AES)
حالا این مقدار رو بفرستیم سمت کاربر و کلید رو سمت سرور ذخیره کنیم. این طوری اولا مقادیر قابل خوندن برای کاربر نیستن، دوما قابل تغیر (تغییری که سر مارو کلاه بزاره).
البته فکر می کنم خود ViewState اگه حالت رمز نگاریش رو فعال کنید، یه همچین مکانیزمی استفاده کنه.
از این روشی که گفتم توی پاس دادن امن مقادیر بین صفحات میشه استفاده کرد. ( البته از طریق QueryString).
در ادامه راجع به مواقعی که بهتره از چند Page مجزا استفاده کرد، بیشتر صحبت می کنیم!

hamedsabzian
جمعه 21 خرداد 1389, 17:28 عصر
یه مثال از زمانی که بهتره از صفحات جداگانه به جای MultiView استفاده کرد.
توی پروژه ای که الان دارم روش کار می کنم (سیستم آموزش مجازی: بخش آزمون آنلاین)، دانش آموز بعد از Login کردن برای مشاهده ی دروس ترم جاریش وارد یک صفحه می شه که حاوی یه MultiView هست:
V1: یک GridView برای لیست دروس
V2: یکی دیگه برای لیست تکالیف هر درس
V3: یکی هم برای لیست نمراتی که تا حالا دانش آموز از درس مربوطه گرفته
V4: این دیگه آخریشه، برای نمایش لیست آزمون های مجازی تعریف شده برای درس در تاریخ مشخص، که با کلیک بر روی هر کدوم اگه موقع امتحان رسیده بود می تونه بره و امتحان رو بده.
برای قسمت آخر، بنده یک Page جدید درست کردم و در اون سوالات در یک Repeater به کاربر نمایش میدادم و فقط و فقط همین! البته ID امتحان رو توی Session گذاشتم تا توی صفحه ی امتحان اون رو وردارم و نیز فیلد ID امتحان رو بعد از ورداشتن بلافاصله Remove کردم!
تصور کنید اگه می خواستم محتویات این صفحه رو توی V5 قرار بدم، چقدر بد می شد!:اشتباه:

دوستان ما رو از نظراتشون بی بهره نذارن!:قلب: