فرم های ASP.NET دلفی چیست؟
. او همچنان یک میزبان از کتابخانه های منبع باز را در http://github.com/RickStrahl حفظ می کند و شما می توانید وبلاگ ریک را در weblog.west-wind.com پیدا کنید یا به طور مستقیم با rstrahl@west-wind.com تماس بگیرید
تبلیغات:
اعلام اخیر مایکروسافت که ASP.NET به زودی یک موتور جایگزین در چارچوب کنترلگر Model View Controller ASP.NET می گیرد (MVC، نگاه کنید به مقالات ماه گذشته)، برخی از بحث های تازه راجع به مزایا و معایب فرم های وب و نیاز بالقوه ای برای یک مکانیسم متناوب ساخت برنامه های کاربردی وب است که یک مدل نزدیک تر و خالص برای توسعه وب را فراهم می کند. این درست است به ویژه با توجه به سبک توسعه مختلف که برنامه های AJAX / Web 2.0 معرفی می کنند و برخی از عوارضی که با شیوه های توسعه ی وب فرم ها ایجاد می شود.
منتقدانه که در حال حاضر به آرامی بیرون می آید عمدتا در برابر موتور وب فرم ها قرار دارد که در بالای هسته ASP.NET Runtime قرار دارد. بسیاری از اختلاف نظر در مورد فرم های وب از پایان ALT.NET طیف توسعه دهنده و به ویژه از توسعه دهندگان است که تمرکز بر توسعه چابک هستند، اما همچنین کمی از گمانه زنی ها از توسعه دهنده های سخت افزاری ASP.NET به طور کلی که برخی از شرایط مرزی از صفحه صفحه ASP.NET که فرم های وب معرفی شده است. فرم های وب برجسته ترین ویژگی موتور ASP.NET هستند. آنها یک مدل کاربردی را ارائه می دهند که بسیاری از مضامین بدون وب سایت و معانی HTML را خلاص می کند و این انتزاع تا حدودی ناهمواری دارد؛ هر دو طرف و ضعف های آن است.
فرم های وب قدرت
شخصا از فرم های وب استفاده کرده ام، چون مایکروسافت ابتدا دات نت را منتشر کرد و من نسبت به این پیاده سازی محتاطانه بودم. مطمئنا من مشکلی نداشتم و من برخی از ویژگی های وب فرم را لعنت گذاشتم و بعدا در این مقاله به آن ها خواهم پرداخت. اما در کل، وب فرم ها یک مدل خوب برای کار با تمام آن سال ها بوده اند. با این حال، بحث در مورد چارچوب های جایگزین بالقوه نیز من را به فکر کمی در مورد آنچه که کار می کند و آنچه در فرم های وب نیست و آنچه که من می خواهم از یک چارچوب متناوب. بنابراین ابتدا لیستی از نقاط قوت و ضعف فرم های وب را از دیدگاه من بیاموزم. من با نکات برجسته ای از موضوعات خوب شروع می کنم.
قدرتمند، مقیاس پذیر، پایدار، و بالغ
فرم های وب ASP.NET اکنون بیش از پنج سال در حال تولید هستند و به عنوان یک پلت فرم مقیاس پذیر و پایدار برای ساخت برنامه های کاربردی وب ثابت شده اند. بسیاری از برنامه های کاربردی بالا از ASP.NET و Web Forms برای استفاده از وب سایت های با حجم بالا استفاده می کنند و ASP.NET در این محیط ها چیزی جز پایدار بودن ندارد. برای من شخصا، ASP.NET نسبت به محیطهای مبتنی بر COM که قبلا مورد استفاده قرار گرفته اند بسیار قابل اعتماد بوده است. ASP.NET و فرم های وب برای سال های سالی بدون هیچ مشکلی در مقیاس پذیری یا ثبات در تمام این سال ها اجرا می شوند و انواع برنامه های مختلف را در سرورهای من و سایت های مشتری با برنامه های کاربردی بزرگ و کوچک. به نظر من این دشوار است که ارزش صلح آمیز را به من بدهد.
Advertisement
آسان برای شروع با
ASP.NET به وضوح یک مفهوم آسان برای توسعه دهندگان برای شروع کار است زیرا آن را خودکار تعدادی از وظایف تکراری برای شما. مدل postback باعث می شود که اطلاعات POST در کنترل ها حفظ شود بدون نیاز به دستی آنها را در هر عملیات POST مجددا اختصاص دهید. اگر ViewState را فعال کنید، می توانید به طور خودکار کنترل وضعیت داده های POST را حفظ کنید. مایکروسافت کل سیستم Visual Studio Web ecosystem را طراحی کرد تا یک تجربه توسعه آسان با قابلیت کشیدن و رها کردن بر روی یک طراح بصری را با پشتیبانی از صفحه پشتیبانی کند. توسعه دهندگان کد را برای پاسخ به رویدادها ارسال می کنند، که یک مدل نسبتا ساده برای اتصال به منطق برنامه ای است که طبیعی است، اگر تا حدودی غیر وب مانند باشد. این مدل سطح بالایی از انتزاع را برای شروع خوب فراهم می کند، اما این نیز مشکل ساز است زیرا توسعه دهنده را از طریق مکانیک وب کم در بسیاری از موارد جدا می کند. من کمی بعدا به این سمت برگردم.
Extensible، Extensible، Extensible
یکی از جاذبه های اصلی وب فرم ها، مدل کنترل غنی است که منجر به گسترش وسیعی از کنترل های سفارشی از طرف های ثالث می شود که انواع قابلیت های اضافی را برای ASP.NET ارائه می دهند. مدل کنترل قدرتمند است، نسبتا آسان به کار با آن، و فراهم می کند یک سیستم زیست محیطی کامل از تجربه توسعه به قابلیت های زمان اجرا و توانایی قلاب و گسترش معماری وب فرم تقریبا در هر نقطه. این نیز قدرت و ضعف در این است که API های API چارچوب بسیار غنی هستند، اما همچنین بسیار پیچیده است. بسیاری از کلاس ها در چارچوب (مانند صفحه) دارای رابط های بزرگ و برای سناریوهای پیشرفته تر هستند، شما باید یک آشنایی دقیق با مدل رویداد صفحه داشته باشید. تبدیل شدن به واقعا مهارت وب فرم ها فراتر از اصول اولیه می تواند یک کار دلهره آور باشد.
این یک لیست مختصر است، اما من نمی توانم به طور کافی تمام آنچه را که این فهرست کوتاه شامل است ثبات، مقیاس پذیری و انعطاف پذیری با یک API ثابت و پایدار است که همه آنها پایه و اساس یک پلت فرم جامع وب است.
نگرانی درباره فرم های وب
اگر با مدتی از Web Forms کار کرده باشید و با مدل سازگار باشید، احتمالا بعضی از محدودیت ها و مزاحمت های آن را تجربه کرده اید. وب سایت های وب به خوبی کار می کنند، اما زمانی که من به چند مورد از این مسائل برمی خوردم، لعنت می کنم.
فرم های وب و انتزاع نشت
فرم های وب برای اکثر توسعه دهندگان، مخصوصا کسانی که از توسعه دسکتاپ استفاده می کنند، یک پلت فرم جذاب هستند. ردیابی Postback، ViewState، مسیریابی رویداد، و استاپور تک صفحه همه براساس یک رابط مبتنی بر فرم است که شبیه یک رابط سبک Windows Forms است. کلمه عملی در اینجا شبیه است!
انتقاد با مدل Web Forms ASP.NET عمدتا از توسعهدهندگان سخت افزاری وب است که فرمهای وب را به عنوان یک لایه انتزاعی نشت می کنند که پارادایم وب را به طور واقعی نمی گیرند. وب فرم ها اساسا سعی می کنند یک اجرای ویندوز / دسک تاپ را تقلید کنند که ماهیت بی ثبات وب را پنهان می کند. فرم های وب سطح بالایی از انتزاع پیاده سازی وب را با استفاده از یک موتور پیچیده کنترل و مبتنی بر رویداد که درخواست مسیریابی، دسترسی و رندر درخواست را دارد، عمدتا مفاهیم HTML و HTTP از توسعه دهندگان را پنهان می کند.
این هم برکت و لعنت است. فرم های وب به توسعه دهندگان اجازه می دهد تا به سرعت در حال ایجاد برنامه های کاربردی به راحتی با کشیدن و رها کردن کنترل و مدیریت رویدادهای صفحه در هر صفحه و کنترل های صفحه. این کار به خوبی انجام می شود، اما سطح بالایی از انتزاع است و بسیاری از توسعه دهندگان به طور کامل فراموش کرده یا هرگز یاد نگرفته اند که چطور طرح HTML در حقیقت در صحنه ها کار می کند. در نتیجه، معمول است که در نهایت با غیر معتبر HTML، یا پیچیده و سخت به مدیریت چیدمان HTML است که بسیار طراح غیر دوستانه است. به این مقدار عظیمی از ViewState اضافه کنید اگر به طور موثر مدیریت ViewState را به درستی انجام ندهید و شما به راحتی می توانید صفحاتی را که بسیار بیشتر از آنچه که نیاز دارید و به عنوان ملاس تبدیل می شوند، به پایان برسانید.
یکی از دلایل چارچوب وب فرم ها این است که در پشت این لایه انتزاع، مایکروسافت یک موتور بسیار پیچیده ای ساخته است که عوارض جانبی زیادی در صفحه خط تولید دارد. اگر شما تا به حال صفحات پیچیده ای را ساخته اید که حاوی بسیاری از اجزای موجود در صفحه است، گاهی اوقات می توانید پیچیدگی رویداد رویداد برای اتصال داده، رندر کردن و راه اندازی کنترل های مختلف را در زمان درست در چرخه صفحه بسیار دشوار کنید. آیا داده ها را در حوادث Init، Load یا PreRender بارگذاری می کنید یا در حوادث پس از آن ارزش گذاری می کنید؟ فرم های وب باید از طریق یک فرم سرور تک اجرا شوند تا بتوانند به راحتی به واحدهای منطقی کوچک شکسته شوند. در فرم های پیچیده، مدیران رویداد می توانند بسیار زیاد با وظایفی که نیاز به رسیدگی دارند و اغلب به طریقی که نمی توانند به آسانی رفع شوند، به شما کمک می کند تا کد را که برای نگهداری و آزمایش غیرممکن است دشوار کنید.
من اغلب به سناریوهایی مانند نحوه تغییر رویدادها بر روند اتصال و تخصیص تأثیر می گذارم. زمانی که یک کنترل را در رابطه با دیگری تنظیم کنید، یک سناریوی معمول دیگر است. اگر برنامه های ASP.NET Web Forms را از هر گونه پیچیدگی ساخته اید، احتمالا این مشکلات توالی را بیش از چند بار اجرا می کنید. این مشکلات می توانند حتی توسعه دهندگان ASP.NET را تجربه کرده و توسعه دهندگان جدید را کاملا خشمگین کنند.
ViewState: Evil Within
شخصا بزرگترین گوشت گاو من با فرم وب بر روی ViewState است. از ViewState متنفر هستم و صادقانه می توانم مایکروسافت را هرگز آن را ایجاد نکنم. در حقیقت، ViewState را فقط در مورد تمام صفحات وب فرم های من به عنوان مقوله اولیه سازی (و حتی پس از آن من نمی توانم از آن به طور کامل از بین ببرم). چرا؟ از آنجا که صفحه ViewState bloats محتوای بسیار شدید است، مقدار کمی سررسید (سریال) و در برنامه های AJAX به خصوص، فساد ViewState ناشی از به روز رسانی مشتری به داده های صفحه می تواند درد سلطنتی برای مقابله با.
من با انواع مشتریان کار می کنم، تعداد قابل توجهی از کد ASP.NET مختلف را می بینم، و من اغلب به منظور کمک به تشخیص مشکلات عملکرد با برنامه های کاربردی وب استفاده می شود. در درصد بالایی از موارد، مسائل مربوط به عملکرد به طور مستقیم در ارتباط با استفاده گسترده از ViewState و توسعه دهندگان است که تاثیر آن بر اندازه صفحه و عملکرد را نمی فهمند.
مشکل بزرگ با ViewState این است که آن غیر deterministic است و توسعه دهندگان کنترل را تشویق به ذخیره تمام وضعیت اموال در داخل ViewState، که هر دو ناکارآمد و نفخ محتوای صفحه. راه حل هایی در این زمینه وجود دارد. شما می توانید همانطور که من انجام می دهید و ViewState را برای هر محتوایی که نیازی به آن ندارید را خاموش کنید یا بیشتر از تمام صفحات جاه طلبانه عمل کنید، هرچند که همیشه بعضی از کنترل ها، به ویژه شخص ثالث، امکان پذیر نیستند، اغلب بدون ViewState می توانند کار کنند. تمام کنترل های سهام ASP.NET که در جعبه واقع می شوند با ViewState خاتمه می یابند، اگر چه ممکن است مجبور شوید چندین خصوصیت اضافی را به صورت صریح تنظیم کنید و شما می توانید چند قطعه کد اضافی را برای ردیابی برخی از تنظیمات به پایان برسانید، اما معمولا به پایان می رسد با صفحات سبک تر و مشتاق تر نیز AJAX دوستانه تر است.
نفوذ ViewState به اندازه کافی برای من مهم است که من یک کنترل PreserveProperty ( http://www.code-magazine.com/Article.aspx؟quickid=0703051 ) نوشتم که روش قطعیتری برای ذخیره محتوای دولت (یا در ControlState، جداگانه متغیر مخفی، کش یا جلسه) که به نظر من راه بسیار خوبی برای ارائه پایداری صفحه است. به جای تشویق هر گونه اموال و کنترل زیر را در ViewState ریشه دارد، یک رویکرد قطعی تر، نیاز به محدودیت بیشتر و تمرکز بر جنبه های کلیدی که باید حفظ شود و نه همه چیز را به طور خودکار به نمایش درآورند.
Advertisement
پیچیدگی مدیریت رویداد
فرم های وب همه چیز مربوط به رویدادها هستند. حوادث خط لوله، حوادث پس از آن و رویدادهای تغییر همه در هسته فرم های وب هستند. در حالی که حوادث بخشی از آنچه Web Forms آسان می کند نیز می توانند پیچیده شوند، زیرا ASP.NET یک حادثه را به عنوان بخشی از هر درخواست ایجاد می کند. دقیقا مشخص کنید زمانی که هر قطعه کد در صفحه خود را آتش می زند و همچنین زمانی که هر کنترل کننده یا کاربر کنترل آتش نشان می دهد درک کامل از مدل صفحه کامل و کنترل درخت معماری است که بی اهمیت است و نیاز به کمی تجربه و زمان دارد.
یکی دیگر از مزایای بسیار ناراحت کننده در قالب وب، تغییر مدیریت رویداد است. دست خود را بالا ببرید اگر تا به حال با مسائل ListBox SelectedValue مشکل دارید که در آن شما نیاز به رسیدگی به رویداد SelectedIndexChanged واقعی دارید و همچنین باید ملک SelectedIndex را صریحا اختصاص دهید. هر زمان رخ می دهد که رویداد ها تغییر می کنند، این امر بسیار معمول است که رفتار غیرمنتظره ای را با این رویدادها از عملیات به ظاهر غیر مرتبط از ابتدای کنترل و دسترسی مستقیم به اجرا در آورند.
این به پیاده سازی خاص چارچوب صفحه و نحوه و زمان وقوع حوادث باز می گردد. توسعه دهندگان باید به طور متوالی با دنباله رویداد آشنا باشند؛ چرا که بسیاری از رویدادهای بسیاری وجود دارد که به عنوان بخشی از روند صفحه هر دو در صفحه و هر کنترل وجود دارد.
این موضوع یکی از رایج ترین درد های درد نیست، اما اتفاق می افتد و زمانی که اتفاق می افتد، آنها تمایل به غرق شدن زمان زیادی دارند. من اغلب خودم را صرف زمان زیادی انجام می دهم که با پیاده سازی های مختلف آزمایش می شود چون من به طور پیشفرض بین رویدادها حرکت می کنم تا به طور کامل حذف کد رویداد و بررسی یک متغیر Request.Form برای دکمه یا رویداد postback صریح و سپس مسیریابی به روش متفاوتی به جای آن. من در نهایت به نتیجه منسجم و غیر قابل پیشبینی کد من فقط به برنامه من تعبیه شده است.
پست های برگشتی
فرم های وب بر مبنای پیشنهادها هستند. همه چیزهایی که در صفحه Forms وب انجام می دهید، به غیر از دسترسی به صفحه اول، به نظر می رسد یک پست پشتی باشد که صفحه آن همیشه تماس گرفته و به یک صفحه ارسال می کند. Postbacks هر چیزی را اخراج می کنند، اما یک دکمه نیاز به کد جاوا اسکریپت دارد که صریحا رویداد PostBack را به همان صفحه می فرستد و درخواست را به یک رویداد خاص هدایت می کند. رویدادهای PostBack چیزی است که باعث می شود که قابلیت های رویداد مبتنی بر Web Forms امکان پذیر باشد، ارائه مدل رویداد مانند WinForms که هر دو بسیار آسان است برای استفاده و در عین حال برای برخی ناراحت کننده است.
اولین و شاید جدی ترین مسئله این است که اکثر عملیات پس از بازبینی توسط جاوا اسکریپت انجام می شود. برای مثال، اگر شما یک GridView در یک صفحه داشته باشید و شبکه را با پیکربندی فعال کرده اید، هر صفحه تغییر سبب می شود که __doPostBack () script client اجرا شود. مشکل: این لینک های جاوا اسکریپت موتور جستجوگر دوستانه نیست چرا که موتورهای جستجو لینک های جاوا اسکریپت را دنبال نمی کنند. همین امر برای LinkButtons و کنترل AutoPostBack درست است و در مورد تمام کنترل های دیگر سرور که حوادث پس از ارسال را پشتیبانی می کنند. اگر مرورگرها جاوا اسکریپت را خاموش کرده باشند (که بعضی از موارد غیر معمولی در بعضی از سازمانهای بزرگ وجود ندارد) برنامه شما همچنین می تواند در آب باقی بماند اگر بدون این بازخورد های جاوا اسکریپت قابل اجرا نباشد.
اگر میخواهید پسوند را از سمت سرویس گیرنده با جاوااسکریپت فعال کنید، باید __doPostBack () calls را به خود اختصاص دهید و راهی آسان برای تولید امضا رویداد وجود ندارد. نحو برای این فراخوانی ها کمی مرموز است و لینک ها از طریق کد سرور (GetPostBackEventReference ()) ایجاد می شوند که اطلاعات خاص کنترل را در اسکریپت های اسکریپتی قرار می دهد. این کار سرگرم کننده ای نیست که سعی کند یک درخواست مشتری مانند این را به صورت پویا از جاوا اسکریپت نوشتن کد غیر قابل اجرا مانند این انجام دهد:
javascript:__doPostBack(‘ctl00$Content$ dgItemList$ctl14$ctl01’,”)”
INamingContainer و ClientID وودو
کد اسکریپت فوق العاده به دلیل شناسه کنترل طولانی است. مشتری و شناسه های منحصر به فرد ایجاد شده توسط وب فرم ها یک مشکل بزرگ در هنگام کار با کد AJAX کلاینت است که نیاز به دسترسی به یک کنترل خاص دارد. فرم های وب ClientID ها را بر اساس containerhip تولید می کند که اغلب ID های کنترل بسیار طولانی و رمزگشایی را که از کد اسکریپت مشتری مرجع است دشوار می کند. این همیشه سرگرم کننده است که تلاش می کند یک شناسه کنترل مانند این را از یک کنترل ساده ذخیره شده در یک صفحه اصلی مانند این استفاده کند:
<input name=”ctl00$Content$txtQty” type=”text” value=”1″ id=”ctl00_Content_txtQty” />
اگر شما نیاز به استفاده از این کنترل در اسکریپت کلاینت دارید، چه کاری انجام میدهید؟ مرجع کامل ID عجیب و غریب است که ممکن است تغییر کند اگر شما ظرف را تغییر نام دهید و سپس کد مشتری خود را تجزیه می کند؟ یا کد زیر را استفاده کنید:
var ctl = document.getElementById(“<%= this.txtQty.ClientID %>”);
که زشت و غم انگیز است و حتی اگر شما کد جاوااسکریپت را به یک فایل جداگانه .js جدا کنید، حتی کار نخواهید کرد. شناسه های رمزنگاری طولانی نیز به طراحان غیر دوستانه هستند که اغلب از برچسب های CSS بر اساس شناسه ها (#controlId) استفاده می کنند تا سبک طرح بندی شوند.
AJAX و فرم های وب
اسکریپت های سمت سرویس گیرنده و فرم های وب به طور کلی با هم همخوانی ندارند. همانطور که قبلا ذکر کردم، اگر از اسکریپت سرویس گیرنده برای به روز رسانی اطلاعات POST فرستاده شده به سرور استفاده می کنید، اطمینان از صحت ViewState وجود دارد. این باعث می شود که اغلب کار با فریم های دیگر از ASP.NET AJAX، که تنها چارچوبی است که به صراحت مدل وب فرم و ViewState را درک می کند، مشکل است.
برای من، مایکروسافت AJAX به طور کلی راه حل کتابخانه بزرگ در سمت چپ نیست در وهله اول. این بزرگ، بسیار مدولار نیست و تنها قابلیت محدود برای توسعه دهنده سرویس گیرنده را فراهم می کند، زیرا چارچوب سرویس گیرنده بیشتر از یک چارچوب مرکزی / پیاده سازی مرجع از یک کتابخانه مفید API است که قابلیت های قابل استفاده برای اسکریپت های سمت سرویس گیرنده را فراهم می کند. اگر شما آن را با رویکردهای ناهموار و بسیار کاربردی از کتابخانه ها مانند jQuery، Prototype، MooTools و غیره مقایسه کنید، مایکروسافت AJAX احساس می کند که به طور جدی فاقد قابلیت های عملی است. اضافه کردن به آن سفتی و پیچیدگی مدل ایجاد کنترل و سخت است که توجیه استفاده از مایکروسافت AJAX برای هر چیزی، اما کنترل های سمت سرور ارائه شده در UpdatePanel و کنترل AJAX Toolkit.
استفاده از کتابخانه های جایگزین با فرم های وب امکان پذیر است، اما برخی مسائل مورد نیاز برای مراقبت وجود دارد. به طور خاص، فساد ViewState یک مشکل در هنگام به روز رسانی محتوای کنترل مشتری است که در ViewState ذخیره شده است و سپس آن را به سرور ارسال می کند. EventValidation همچنین می تواند تمام مشکلات مربوط به صفحات ارسال شده به سرور را ایجاد کند و می خواهید این ویژگی را در صفحه هایی که از AJAX استفاده می کنند را تغییر دهید و محتوای کنترل را تغییر دهید.