یکی از ویژگیهای مفید jQuery در هنگام توسعهی نرمافزارهای تحت وب، رویدادهای( event ) سراسری است. با تعریف این رویدادها میتوانید در هنگام هر فراخوانی ajax در هر بخش از نرمافزار، آگاه شوید و عملیات دلخواه مانند نمایش عبارت «loading» یا جلوگیری از بارگزاری مجدد صفحه یا هر عمل متناسب دیگر را به انجام برسانید
نظرات مطالب
کامپایل خودکار یک پروژه برای دو فریم ورک
ویژگیهای Condition ذکر شده در متن، در مورد ارجاعات هم قابل تنظیم است:
همچنین در مورد فایلهای سورس:
<Reference Include="MyAssembly" Condition="........."> <SpecificVersion>False</SpecificVersion> <HintPath>path\to\MyAssembly.dll</HintPath> </Reference>
<Compile Include="Class20.cs" Condition=" ....." />
نظرات مطالب
ASP.NET MVC #8
متد TextBoxFor چندین overload دارد برای مشخص کردن ویژگیهای HTML مانند:
در اینجا چون نام class معادل یکی از نامهای رزرو سیشارپ است، یک @ ابتدای آن قرار گرفته.
@Html.TextBoxFor(m => m.LastName, new { @class = "class-name", placeholder = "last name" })
نظرات مطالب
ASP.NET MVC #10
بله. ویژگیهای HttpPost و HttpGet مقدم نیستند بر اصول زبان مورد استفاده. اصول زبان مورد استفاده حین تعریف امضای متدها باید رعایت شوند (هر overloadایی رو نمیشه تعریف کرد). اما ... اگر ... این اصول رعایت شوند و کد شما کامپایل شود، آنگاه میتوان دو یا چند overload را با verbهای مختلفی بدون مشکل دریافت خطای ambiguous استفاده کرد.
ویدیوی رایگانی در مورد پیاده سازی WCF Services با استفاده از اصول REST ، ویژگیهای WebGet و WebInvoke، کار با کلاسهای SyndicationFeed و Rss20FeedFormatter و هاست آن در IIS .
ماخذ
پاسخ به بازخوردهای پروژهها
Helper AjaxDialog چطوری کار میکنه؟
AjaxDialog را در کدها جستجو کنید. مثالهای فراخوانی Razor آن در Viewهای برنامه هست. در یک قسمت این متدهای کمکی سبب میشوند تا تگها و ویژگیهای لازم به صفحه اضافه شوند. قسمت بعد، در فایل adminjs.js پوشه Iris.Web\Scripts این تگها و ویژگیها تحت کنترل هستند تا عکس العمل نشان دهند.
بله. روش آنرا برای NET Core. در اینجا توضیح دادم: «سفارشی سازی ASP.NET Core Identity - قسمت چهارم - User Claims»
در نگارش 2x هم در متد GenerateUserIdentityAsync (که به همراه اطلاعات ApplicationUser وارد شدهی به سیستم هست) فرصت خواهید داشت تا یک Claim جدید را اضافه کنید (همانجایی که نوشته شده Add custom user claims here):
دسترسی به آن هم بعدا به این صورت خواهد بود (که در اینجا IPrincipal همان this.User قابل دسترسی در یک اکشن متد است):
در نگارش 2x هم در متد GenerateUserIdentityAsync (که به همراه اطلاعات ApplicationUser وارد شدهی به سیستم هست) فرصت خواهید داشت تا یک Claim جدید را اضافه کنید (همانجایی که نوشته شده Add custom user claims here):
// Add custom user claims here userIdentity.AddClaim(new Claim("key1", "value1"));
public static string GetClaimValue(this IPrincipal currentPrincipal, string key) { var identity = currentPrincipal.Identity as ClaimsIdentity; if (identity == null) return null; var claim = identity.Claims.FirstOrDefault(c => c.Type == key); return claim?.Value; }
یک نکتهی تکمیلی: روش تعریف data binding دو طرفه در کامپوننتها
در مطلب جاری، binding دو طرفه بررسی شد؛ که نکتهی مورد بحث آن، به ویژگیهای استاندارد HTML مانند ویژگی value یک input استاندارد اختصاص داشت. اما اگر بخواهیم در کامپوننتهای سفارشی خود، این binding دو طرفه را تعریف کنیم تا قابل اعمال به خواص و ویژگیهای #C باشد (مانند bind-ProprtyName@)، روش کار به نحو دیگری است. نمونهی آن کامپوننت استاندارد InputText خود Blazor است که در اینجا هم دارای bind-Value@ است؛ اما این Value (شروع شدهی با حروف بزرگ) یک خاصیت #C تعریف شدهی در کلاس InputText است و نه یک ویژگی استاندارد HTML که عموما با حروف کوچک شروع میشوند:
<InputText @bind-Value="employee.FirstName" />
الف) یک پارامتر عمومی به نام Value باید در کلاس کامپوننت جاری تعریف شود تا بتوان از طریق والد آن، مقداری را دریافت کرد (یک طرف binding به این نحو تشکیل میشود):
[Parameter] public string Value { set; get; }
[Parameter] public EventCallback<string> ValueChanged { get; set; }
نکتهی مهم: در اینجا بجای EventCallback، از Action هم میتوان استفاده کرد:
تفاوت اصلی و مهم آن با EventCallback، در فراخوانی نشدن خودکار متد StateHasChanged، در پایان کار آن است. زمانیکه EventCallback ای فراخوانی میشود، Blazor به صورت خودکار در پایان کار آن، متد StateHasChanged را نیز فراخوانی میکند تا والد دربرگیرندهی کامپوننت جاری، مجددا رندر شود (به همراه تمام کامپوننتهای فرزند آن). اما <Action<T فاقد این درخواست خودکار رندر و به روز رسانی مجدد UI است.
[Parameter] public Action<string> ValueChanged { get; set; }
ج) برای فعالسازی اعتبارسنجی استاندارد فرمهای Blazor، نیاز به خاصیت ویژهی سومی نیز هست (که اختیاری است):
[Parameter] public Expression<Func<string>> ValueExpression { get; set; }
مرحلهی آخر این طراحی، فراخوانی پارامتر ValueChanged است تا به کامپوننت والد این تغییرات را اطلاع رسانی کنیم. روش استاندارد آن به صورت زیر است:
private string _value; [Parameter] public string Value { get => _value; set { var hasChanged = string.Equals(_value, value, StringComparison.Ordinal); if (hasChanged) { _value = value; if (ValueChanged.HasDelegate) { _ = ValueChanged.InvokeAsync(value); } } } }
در این قطعه کد، بررسی ValueChanged.HasDelegate را هم مشاهده میکنید. زمانیکه پارامتر Value ای با طی سه مرحلهی فوق تعریف شد، قرار نیست حتما توسط bind-Value@ مورد استفاده قرار گیرد. میتوان Value را به صورت یک طرفه هم مورد استفاده قرار داد. در این حالت دو پارامتر ب و ج دیگر توسط Blazor ایجاد و مقدار دهی نشده و رهگیری نخواهند شد. یعنی تعریف bind-Value@ در سمت والد، معادل سیم کشی خودکار به ValueChanged و ValueExpression از طرف Blazor است و تعریف دستی آنها ضرورتی ندارد. اما میتوان bind-Value@ را هم تعریف نکرد و فقط نوشت Value. در این حالت از تنظیمات ب و ج صرفنظر میشود. بنابراین ضروری است که بررسی کنیم آیا پارامتر ValueChanged واقعا متصل به روال رویدادگردانی شدهاست یا خیر. اگر خیر، نیازی به اطلاع رسانی و فراخوانی متد ValueChanged.InvokeAsync نیست.
مطالب
CoffeeScript #13
بخشهای بد
در ادامهی قسمت قبل، به مواردی که توسط CoffeeScript اصلاح شدهاند، میپردازیم.
Reserved words
کلمات کلیدی خاصی در جاوااسکریپت وجود دارد مانند class، enum و const که برای نسخههای بعدی جاوااسکریپت در آینده رزرو شدهاند. استفاده از این کلمات در برنامههای جاوااسکریپت میتواند نتایج غیرقابل پیش بینی داشته باشد. برخی از مرورگرهای به خوبی از عهدهی این کار برمیآیند و بعضی دیگر به طور کامل جلوی استفاده از اینها را گرفتهاند. CoffeeScript بعد از تشخیص استفاده از یک کلمهی کلیدی، با یک راه کار خاص، از این موضوع میگریزد.
به عنوان مثال، فرض کنید میخواهیم از کلمه کلیدی class به عنوان یک خصوصیت در یک شیء استفاده کنیم:
myObj = { delete: "I am a keyword!" } myObj.class = ->
var myObj; myObj = { "delete": "I am a keyword!" }; myObj["class"] = function() {};
Equality comparisons
مقایسه برابری ضعف دیگری است که در جاوااسکریپت باعث ایجاد رفتاری گیج کننده و اغلب باعث ایجاد اشکالاتی در کد نوشته شده میشود. به مثال زیر توجه کنید:
"" == "0"// false 0 == ""// true 0 == "0"// true false == "false"// false false == "0"// true false == undefined// false false == null// false null == undefined// true " \t\r\n" == 0// true
راه حل این کار استفاده از عملگر برابری سختگیرانه است، که از 3 مساوی تشکیل شده است: === عملگر برابر سخت گیرانه دقیقا مانند عملگر برابری عادی عمل میکند و تنها نوع دادهها را بررسی میکند که با هم برابر باشند.
توصیه میشود که همیشه از عملگر برابری سختگیرانه استفاده کنید و هرجا لازم بود قبل مقایسه عمل تبدیل نوع دادهها را انجام دهید.
CoffeeScript این مشکل را به صورت کامل حل کرده است؛ یعنی هر جایی که عمل مقایسه == انجام شود به === تبدیل میشود. شما باید به صورت صریح نوع دادهها را قبل از مقایسه تبدیل کرده باشید.
نکته: در مقایسهها رشته خالی ""، null ،undefined و عدد 0 همگی false برمی گردانند.
alert "Empty Array" unless [].length alert "Empty String" unless "" alert "Number 0" unless 0
if (![].length) { alert("Empty Array"); } if (!"") { alert("Empty String"); } if (!0) { alert("Number 0"); }
alert "This is not called" unless ""?
if ("" == null) { alert("This is not called"); }
Function definition
خیلی جالب است که در جاوااسکریپت میتوانید تابعی را بعد از اینکه فراخوانی کردید، تعریف کنید. به عنوان مثال، کد زیر به صورت کامل اجرا میشود:
wem(); function wem() {alert("hi");}
if (true) { function declaration() { return "first"; } } else { function declaration() { return "second"; } } declaration();
، تابع ()declaration مقدار "first" را برگشت خواهد داد و در دیگر مرورگرها مانند Chrome، مقدار "second" برگشت داده خواهد شد. در حالیکه به نظر میرسد که قسمت else هیچگاه اجرا نخواهد شد.در صورتیکه علاقمند به کسب اطلاعات بیشتری دربارهی نحوه تعریف توابع، هستید باید راهنمای آقای Juriy Zaytsev را مطالعه کنید. به صورت خلاصه، رفتار نسبتا مبهم مرورگرها میتواند منجر به ایجاد مشکلاتی در مسیر نوشتن یک پروژه شوند.
همه چیز در CoffeeScript در نظر گرفته شده است و بهترین روش برای حل این مشکل، حذف کلمه function و به جای آن استفاده از عبارت (expression) تابع است.
Number property lookups
نقصی که در پارسر جاوااسکریپت در مواجه با نماد نقطه (dot notation) بر روی اعداد وجود دارد، تفسیر آن به ممیز شناور، بجای مراجعه به ویژگیهای آن است. برای مثال کد جاوااسکریپت زیر باعث ایجاد خطای نحوی میشود:5.toString();
(5).toString(); 5..toString();
مسیرراهها
Twitter Bootstrap
Bootstrap 2
- آغاز به کار با Twitter Bootstrap در ASP.NET MVC
- استفاده از Twitter Bootstrap در کارهای روزمره طراحی وب
- نگاهی به اجزای تعاملی Twitter Bootstrap
- استفاده از modal dialogs مجموعه Twitter Bootstrap برای گرفتن تائید از کاربر
- نمایش فرمهای مودال Ajax ایی در ASP.NET MVC به کمک Twitter Bootstrap
- ساخت قالبهای نمایشی و ادیتور دکمه سه وضعیتی سازگار با Twitter bootstrap در ASP.NET MVC
- استفاده از دکمههای CSS توئیتر در ASP.NET MVC
- استفاده از دکمههای CSS توئیتر در ASP.NET MVC - قسمت دوم
- اعمال کلاسهای ویژه اعتبارسنجی Twitter bootstrap به فرمهای ASP.NET MVC
- نمایش خطاهای اعتبارسنجی سمت کاربر ASP.NET MVC به شکل Popover به کمک Twitter bootstrap
- نمایش خطاهای اعتبارسنجی سمت کاربر ASP.NET MVC به شکل Tooltip به کمک Twitter bootstrap
- مشکل اعتبار سنجی jQuery validator در Bootstrap tabs
- ویرایش قالب پیش فرض Add View در ASP.NET MVC برای سازگار سازی آن با Twitter bootstrap
- ساخت منوهای چند سطحی در ASP.NET MVC
Bootstrap 3
- بوت استرپ (نگارش 3) چیست؟
- بررسی سیستم جدید گرید بوت استرپ 3
- تغییرات صورت گرفته در المانهای تایپوگرافی و شیوه نامههای بوت استرپ 3
- نگاهی به اجزای سیستم راهبری بوت استرپ 3
- اجزای جاوا اسکریپتی بوت استرپ 3
- کار با فرمها در بوت استرپ 3
- صفحات مودال در بوت استرپ 3
- نحوهی صحیح کار کردن با بوت استرپ
- نمایش اخطارها و پیامهای بوت استرپ به کمک TempData در ASP.NET MVC
- سازگارسازی کلاسهای اعتبارسنجی Twitter Bootstrap 3 با فرمهای ASP.NET MVC