ورود

نسخه کامل مشاهده نسخه کامل : درک سینتکس Razor



Life24
15-08-2014, 23:20
سلام،
ما در قوانین razor میگیم که:
میتوان یک بلاک کد را با محصور کردن آن میان @} و{ نوشت:
مثل:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سوال اینجاست. وقتی کل کد را در یک بلاک محصور کردیم و با @ میگیم اینها همخپه کد سی شارپ هستند و HTML نیست. پس چرا در این خط @ را نمی زاریم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیداما در خط بعدی باز نیاز هست که @ بزاریم؟ مگر اینجا همه کد سی شارپ در نظر گرفته نمیشه؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
21-08-2014, 00:47
سلام
سوالات خاصی مطرح میکنید که در نوع خود جالب و فهم آن بطور قطع مهم است.
فقط مشکل آن است که پاسخ دادن شان دقت ، ارائه مثال و وقت زیادی می طلبد تا مطلب به درستی منتقل شود و مشکل را بدتر نکنیم.
ولی باور بفرمائید ترجیح میدهم این سوالات را پاسخ دهم تا سوالات ... !

شما مجموعه ای از علائم را مطرح کردید، گمانم اگر بدانید کدهای فوق به چه شکل نهایی کامپایل خواهند شد، مسئله از بن حل خواهد شد.

در razor مجموعه ای از علائم تاثیر گذار در روند کامپایل داریم...
اول یکسری کلمات کلیدی مانند model@ یا helper@ یا inherits@ و...
و بعد هم یکسری علامت مانند @ و (...)@ و :@ و {...}@ و <text></text> و...
و یکسری خلاصه نویسی که فعلاً بماند.

تمام کار شما در کدهای razor که بظاهر تلفیق html و csharp (یا vb) هستند در باطن و پس از کامپایل به یک کلاس عادی و خالص csharp که وراثتی از System.Web.Mvc.WebViewPage است کامپایل (هرچه تلاش کردم نتوانستم بنویسم، "تبدیل" !) میشود.
پس گرچه razor, html, csharp, vb مینویسید ولی باید بدانید که در حال نوشتن یک class هستید و باز تعریف (override) فقط یک متد هستید.

- این کلاسی عمومی با نام فایلش و وراثت inherits@ و آرگومان جنریکی model@ و توابع کمکی helper@ خواهد بود.

- نماد {...}@ موجب درج مستقیم کدهای برنامه نویسی در کلاس خواهد شد.

- نماد :@ و <text></text> موجب یک عملیات Write مستقیم متن در استریم خروجی خواهد شد.

- نماد (...)@ و @ موجب اجرا شدن دستورات و Write نتیجه پس از HtmlEncode در استریم خروجی خواهد شد.

- نماد @ بطور هوشمند و بسته به محل استفاده، (فاقد خروجی مستقیم و برای کلمات کلیدی مانند for using و...) موجب درج یک بلاک کد در کدها میشود.

اجازه دهید مطلب را با ذکر چند مثال تعقیب کنیم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

بعنوان نمونه الآن باید متوجه شوید چرا نمیتوانید تابعی که void برمیگرداند را با یک @ اجرا کنید.
چرا کد this.Html.RenderPartial@ غلط است و گیومه میخواهد ولی this.Html.Partial@ کار میکند و گیومه هم نمیخواهد!؟؟؟


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این مقدمه بود (و شاید هم همه آنکه باید بدانید)، علی الحساب داشته باشید، الآن کمی دیروقت است، در فرصتی دیگر سوالتان را مرور و در صورت نیاز پاسخ تکمیلی به بندهای مطوحه را خواهم دارد.
کلید تمام سوالات تان، درک چگونگی دید کامپایلر razor است. (قرار دادن خود جای کامپایلر)
شب خوش.

_H2_
21-08-2014, 22:05
سلام مجدد


وقتی کل کد را در یک بلاک محصور کردیم و با @ میگیم اینها همخپه کد سی شارپ هستند و HTML نیست. پس چرا در این خط @ را نمی زاریم ... اما در خط بعدی باز نیاز هست که @ بزاریم؟ مگر اینجا همه کد سی شارپ در نظر گرفته نمیشه؟


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سوال این است که ، کدشما در خط Line2 دستورات csharp است و Model.Category در خط Line4 هم کد csharp است، پس چرا فقط دومی @ میخواهد؟
جواب روشن است!
- چون ...)if قرار نیست در خروجی چاپ شود.
- چون ...)if باید مستقیم درکدها درج شود و نیازی به Write ندارد.
- چون Model.Category خط چهارم نیاز به تابع Write دارد تا نتیجه آن در خروجی ظاهر شود.
- ضمن اینکه در مورد کدهای خاص شما در اینجا، کامپایلر razor نیاز دارد به نحوی متوجه شود :@ که فرمان شروع آن را برای عبارت " :Category" داده اید، کجا تمام میشود.

برای :@ خط چهارم هم که شما نپرسیدید، کامپایلر razor نیاز دارد بداند که عبارت " :Category" باید عیناً (WriteLiteral) در خروجی ریخته شود.
برای متوجه شدن این مطلب هم :@ یا <text> یا یک تگ html مانند خط 9 لازم است.

جهت درک بیشتر، کد کامپایل شده شما چیزی شبیه این خواهد بود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
موفق باشید.