اشتراکها
اشتراکها
شروع کار با Transition ها در CSS
اشتراکها
ایجاد flag بوسیله CSS
اگر خروجی return File را در اکشن متدهای ASP.NET Core همانند ASP.NET MVC 5.x مورد استفاده قرار دهید و در آن مسیرکامل فایل را برای بازگشت قید کرده باشید، پیام یافت نشدن فایل را دریافت خواهید کرد؛ هرچند این فایل بر روی سرور و در مسیر ذکر شده وجود خارجی دارد. علت آنرا در تصویر ذیل میتوانید مشاهده کنید:
روشهای مختلف بازگشت فایلها به سمت کلاینت در ASP.NET Core
در ASP.NET Core، نوعهای کاملتری از Action Resultهای مرتبط با بازگشت فایلها تدارک دیده شدهاند که نحوهی طراحی آنها را در شکل فوق ملاحظه میکنید. در اینجا FileResult والد تمام حالتهای بازگشت فایل است که شامل موارد ذیل میشود:
FileContentResult: از آن برای بازگشت آرایهای از بایتها استفاده میشود:
زمانیکه Controller جاری از کلاس پایه Controller ارث بری میکند، متد File در این کلاس پایه قرار دارد. به همین جهت مانند مثال فوق به سادگی میتوان به آن، بدون ذکر new دسترسی یافت. روش دیگر دسترسی به FileContentResult به صورت ذیل است که معادل قطعه کد فوق میباشد:
FileStreamResult: این Action Result قابلیت Streaming بازگشت فایلها را مهیا میکند:
در اینجا برای مثال میتوان یک MemoryStream و یا یک FileStream را به سمت کاربر ارسال کرد. این روش نسبت به خواندن فایلها در آرایهای از بایتها و سپس ارسال یکجای آن، بهینهتر است و حافظهی کمتری را مصرف میکند.
اگر خواستیم مستقیما با FileStreamResult کار کنیم، روش کار به صورت ذیل است:
VirtualFileResult: در این مورد آدرسی را که ارائه میدهید، باید به فایلی درون پوشهی wwwroot اشاره کند (علت اصلی بروز مشکلی که در مقدمهی بحث عنوان شد). در اینجا آدرس کامل فایل مدنظر نیست.
و یا معادل همین قطعه کد با استفاده از VirtualFileResult اصلی به صورت ذیل است:
PhysicalFileResult: اگر قصد دارید آدرس کامل فایلی را مشخص کنید (بجای مسیر نسبی آن که از wwwroot شروع میشود؛ مانند حالت قبل)، اینبار باید از متد PhysicalFile استفاده کرد:
این قطعه کد نیز بر اساس استفادهی مستقیم از PhysicalFileResult شکل زیر را میتواند پیدا کند:
در این متدها و کلاسها، اگر FileDownloadName حاوی حروف اسکی نباشد، به صورت خودکار encoding از نوع RFC5987 بر روی آن اعمال خواهد شد.
روشهای مختلف بازگشت فایلها به سمت کلاینت در ASP.NET Core
در ASP.NET Core، نوعهای کاملتری از Action Resultهای مرتبط با بازگشت فایلها تدارک دیده شدهاند که نحوهی طراحی آنها را در شکل فوق ملاحظه میکنید. در اینجا FileResult والد تمام حالتهای بازگشت فایل است که شامل موارد ذیل میشود:
FileContentResult: از آن برای بازگشت آرایهای از بایتها استفاده میشود:
//returns the file content as an array of bytes public FileContentResult FileContentActionResult() { var file = System.IO.File.ReadAllBytes(@"C:\path\dir1\HomeController.cs"); return File(file, "text/plain", "HomeController.cs"); }
public IActionResult TestFileContentActionResult() { var file = System.IO.File.ReadAllBytes(@"C:\path\dir1\HomeController.cs"); return new FileContentResult(file, "text/plain") { FileDownloadName = "HomeController.cs" }; }
FileStreamResult: این Action Result قابلیت Streaming بازگشت فایلها را مهیا میکند:
//return the file as a stream public FileStreamResult FileStreamActionResult() { //var file = System.IO.File.ReadAllBytes(@"C:\path\dir1\HomeController.cs"); //var stream = new MemoryStream(file, writable:true); var fileStream = new FileStream(@"C:\path\dir1\HomeController.cs", FileMode.Open, FileAccess.Read); return File(fileStream, "text/plain", "HomeController.cs"); }
اگر خواستیم مستقیما با FileStreamResult کار کنیم، روش کار به صورت ذیل است:
public IActionResult TestFileStreamActionResult() { //var file = System.IO.File.ReadAllBytes(@"C:\path\dir1\HomeController.cs"); //var stream = new MemoryStream(file, writable:true); var fileStream = new FileStream(@"C:\path\dir1\HomeController.cs", FileMode.Open, FileAccess.Read); return new FileStreamResult(fileStream, "text/plain") { FileDownloadName = "HomeController.cs" }; }
VirtualFileResult: در این مورد آدرسی را که ارائه میدهید، باید به فایلی درون پوشهی wwwroot اشاره کند (علت اصلی بروز مشکلی که در مقدمهی بحث عنوان شد). در اینجا آدرس کامل فایل مدنظر نیست.
//returns a file specified with a virtual path public VirtualFileResult VirtualFileActionResult() { return File("/css/site.css", "text/plain", "site.css"); }
public IActionResult TestVirtualFileActionResult() { return new VirtualFileResult("/css/site.css", "text/plain") { FileDownloadName = "site.css" }; }
PhysicalFileResult: اگر قصد دارید آدرس کامل فایلی را مشخص کنید (بجای مسیر نسبی آن که از wwwroot شروع میشود؛ مانند حالت قبل)، اینبار باید از متد PhysicalFile استفاده کرد:
//returns the specified file on disk, that is it's physical address public PhysicalFileResult PhysicalFileActionResult() { return PhysicalFile(@"C:\path\dir1\HomeController.cs", "text/plain", "HomeController.cs"); }
public IActionResult TestPhysicalFileActionResult() { return new PhysicalFileResult(@"C:\path\dir1\HomeController.cs", "text/plain") { FileDownloadName = "HomeController.cs" }; }
در این متدها و کلاسها، اگر FileDownloadName حاوی حروف اسکی نباشد، به صورت خودکار encoding از نوع RFC5987 بر روی آن اعمال خواهد شد.
نظرات مطالب
پرسش و پاسخهای متداول ایجاد یک وبلاگ بلاگری
قرار بود فقط دو تا سؤال بپرسید :)
- فرمت قالبها xml است و با فرانت پیج قدیمی یا expression web جدید قابل ویرایش نیست و اصلا ادیتوری هم ندارد (یا جایی منتشر نشده تا جایی که اطلاع دارم). دستی باید روی آن کار شود.
- برای قرار دادن عکس در بک گراند، شما فقط کافی است عکس مورد نظر را در یک سایت دیگر آپلود کنید، سپس یک css تعریف کرده و آنرا اعمال نمائید. به سلکتور body یا تگ body قابل اعمال است. اطلاعات بیشتر:
http://www.w3schools.com/css/pr_background-image.asp
- برای تعیین رنگ و اندازه تاریخ، باز هم باید css سایت را در همان قسمت ویرایش html سایت ویرایش کنید. برای مثال این موارد باید اضافه شود:
h1, h2, h3 {
font-family: Tahoma;
direction: rtl;
font-size:8pt;
color:green;
text-align: right;
}
- تاریخ آرشیو هم در همان مقاله هست و باید اعمال شده باشد.
در کل شکل و شمایل این قالبها با ویرایش css آن تا حد قابل قبولی قابل تغییر است (بدون نیاز به دستکاری قسمتهای دیگر که مربوط به تعریف ویجتها است)
- فرمت قالبها xml است و با فرانت پیج قدیمی یا expression web جدید قابل ویرایش نیست و اصلا ادیتوری هم ندارد (یا جایی منتشر نشده تا جایی که اطلاع دارم). دستی باید روی آن کار شود.
- برای قرار دادن عکس در بک گراند، شما فقط کافی است عکس مورد نظر را در یک سایت دیگر آپلود کنید، سپس یک css تعریف کرده و آنرا اعمال نمائید. به سلکتور body یا تگ body قابل اعمال است. اطلاعات بیشتر:
http://www.w3schools.com/css/pr_background-image.asp
- برای تعیین رنگ و اندازه تاریخ، باز هم باید css سایت را در همان قسمت ویرایش html سایت ویرایش کنید. برای مثال این موارد باید اضافه شود:
h1, h2, h3 {
font-family: Tahoma;
direction: rtl;
font-size:8pt;
color:green;
text-align: right;
}
- تاریخ آرشیو هم در همان مقاله هست و باید اعمال شده باشد.
در کل شکل و شمایل این قالبها با ویرایش css آن تا حد قابل قبولی قابل تغییر است (بدون نیاز به دستکاری قسمتهای دیگر که مربوط به تعریف ویجتها است)
نظرات مطالب
معرفی Kendo UI
کد زیر رو در ویو اضافه کردم و فایل جی کوئری هم در layout وجود داره
جی کوئری یکبار صدا زده شده ولی متاسفانه خطای زیر رو میده:
چه مواردی رو باید برای رفع خطا بررسی کنم؟
@section JavaScript { <!--KendoUI: Web--> <link href="@Url.Content("~/content/css/kendo/kendo.common.min.css")" rel="stylesheet" type="text/css" /> <link href="@Url.Content("~/content/css/kendo/kendo.default.min.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/kendo/kendo.web.min.js")" type="text/javascript"></script> <!--KendoUI: DataViz--> <link href="@Url.Content("~/content/css/kendo/kendo.dataviz.min.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/kendo/kendo.dataviz.min.js")" type="text/javascript"></script> <!--KendoUI: Mobile--> <link href="@Url.Content("~/content/css/kendo/kendo.mobile.all.min.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/kendo/kendo.mobile.min.js")" type="text/javascript"></script> <script type="text/javascript"> $(function () { $("#pickDate").kendoDatePicker(); }); </script> }
جی کوئری یکبار صدا زده شده ولی متاسفانه خطای زیر رو میده:
TypeError: $(...).kendoDatePicker is not a function
چه مواردی رو باید برای رفع خطا بررسی کنم؟
احتمالا فایرفاکس 4 رو تازه نصب کردید:
یکی از موارد جالب توجه آن منهای مورد فوق، امکان تغییر سایز TextArea در آن به صورت "سر خود" میباشد (همانند مرورگر کروم) :
برای غیرفعال کردن این قابلیت باید css سایت یا عنصر مورد نظر را به صورت ذیل تغییر داد:
<style type="text/css">
textarea {
resize:none;
}
</style>
1- .class
در مثال فوق Text 1 و Text 3 به رنگ قرمز و Text 4 به رنگ آبی نمایش مییابند.
2- #id
در مثال فوق محتوای کادر رمز عبور به رنگ قرمز نمایش مییابد.
3- E
در مثال فوق Text 1 و Text 3 به رنگ قرمز نمایش مییابند.
4- *
در مثال فوق رنگ متن تمامی تگهای فوق قرمز خواهد شد.
5- S1 S2
در مثال فوق Text 2، Text 3 و Text 5 به رنگ قرمز نمایش مییابند.
6- S1>S2
در مثال فوق Text 2 و Text 5 به رنگ قرمز نمایش مییابند.
7- S1+S2
در مثال فوق Text 2 و Text 6 به رنگ قرمز نمایش مییابند.
8- S1~S2
در مثال فوق Text 4 و Text 6 به رنگ قرمز نمایش مییابند.
9- S1!>S2
در مثال فوق کادری قرمز رنگ را دور آن div که شامل محتوای Text 2، Text 3 و Text 4 میباشد، ترسیم خواهد نمود.
10- S1 /attribute/ S2
در مثال فوق، اولین تگ input که id آن user میباشد و توسط تگ label و با استفاده از ویژگی for (به id تگ input) ارجاع داده شده است، انتخاب و محتوای آن قرمز میشود.
این Selector تگهایی را انتخاب مینماید که عضو یک کلاس خاص باشند.
<style> .first{ color: red} .content{color:blue} </style> <div class="first">Text 1</div> <div>Text 2</div> <p class="first">Text 3</p> <div class="content">Text 4</div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | Yes | Yes | Yes | .class | 1 |
2- #id
این Selector تگی را انتخاب میکند که دارای یک id خاص میباشد.
<style> #pass { color: red; } </style> <input type="password" id="pass"/>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | Yes | Yes | Yes | #id | 1 |
3- E
جهت انتخاب تگها براساس عنوان آنها استفاده میشود.
<style> div { color: red; } </style> <div>Text 1</div> <p>Text 2</p> <div>Text 3</div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | Yes | Yes | Yes | E | 1 |
4- *
این Selector تمامی تگها را انتخاب مینماید
<style> * { color: red; } </style> <div>Text 1</div> <input type="text" value="Text 2"/> <select> <option>Option 1</option> <option>Option 2</option> <option>Option 3</option> <option>Option 4</option> </select>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
3.1 | 9.6 | 7.0 | 2.0 | 4.0 | * | 2 |
5- S1 S2
تمامی المنتهای S2 که فرزند S1 میباشند، انتخاب خواهند شد.
<style> div span { color:red } </style> <div> <h1>Text 1</h1> <span>Text 2</span> <p> <span>Text 3</span> <div>Text 4</div> </p> <span>Text 5</span> </div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | Yes | Yes | Yes | S1 S2 | 1 |
6- S1>S2
تمامی المنتهای S2 که فرزند مستقیم S1 میباشند، انتخاب خواهند شد.
<style> div>span { color:red } </style> <div> <h1>Text 1</h1> <span>Text 2</span> <p> <span>Text 3</span> <div>Text 4</div> </p> <span>Text 5</span> </div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | 7.0 | Yes | Yes | S1>S2 | 2 |
7- S1+S2
تمامی المنتهای S2 که هم تراز S1 و دقیقا بعد از S1 قرار گرفته اند را انتخاب مینماید.
<style> h1+p { color: red; } </style> <div> <h1>Text 1</h1> <p>Text 2</p> <div>Text 3</div> <p>Text 4</p> <h1> <p>Text 5</p> </h1> <p>Text 6</p> </div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
Yes | Yes | 7.0 | Yes | Yes | S1+S2 | 2 |
8- S1~S2
تمامی المنتهای S2 که هم تراز S1 میباشند و بعد از S1 قرار گرفته اند را انتخاب مینماید.
<style> div ~ p { color: red; } </style> <div> <h1>Text 1</h1> <p>Text 2</p> <div>Text 3</div> <p>Text 4</p> <h1> <p>Text 5</p> </h1> <p>Text 6</p> </div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
3.2 | 9.6 | 7.0 | 3.5 | 4.0 | S1~S2 | 3 |
9- S1!>S2
این Selector المنتهای S1 را انتخاب میکند که والد مستقیم S2 میباشند.
<style> div!>span { border: 1px solid red; } </style> <div> <h1>Text 1</h1> <div> <span>Text 2</span> <h1>Text 3</h1> <p>Text 4</p> </div> <div>Text 5</div> </div>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
No | No | No | No | No | S1!>S2 | 4 |
10- S1 /attribute/ S2
تمامی المنتهای S2 انتخاب میشوند که توسط یک attribute از S1 به id المنت S2 ارجاع داده است.
<style> label /for/ input { color: red; } </style> <label for="user">User Name:</label> <input type="text" id="user"/> <label>Password:</label> <input type="password" id="pass"/>
پشتیبانی در مرورگرها:
|
|
|
|
| Selector | نسخه CSS |
No | No | No | No | No | S1 /attribute/ S2 | 4 |
اشتراکها
SQL Server 2016 معرفی شد
نظرات مطالب
معرفی Blazor Hybrid
ببینید NET MAUI App که از اساس با Xaml کار میکنه و البته Native UI محسوب میشه
Blazor Hybrid یا همون NET MAUI Blazor App راهکار Blazor هست که HTML/CSS برای UI استفاده میشه، ولی C# .NET اش دسترسی کامل به سیستم عامل داره (بر خلاف Blazor Web Assembly که محدود به Sandbox مرورگر هست)
Blazor Hybrid یا همون NET MAUI Blazor App راهکار Blazor هست که HTML/CSS برای UI استفاده میشه، ولی C# .NET اش دسترسی کامل به سیستم عامل داره (بر خلاف Blazor Web Assembly که محدود به Sandbox مرورگر هست)
پس با Blazor Web Assembly & Server میتونیم PWA / SPA / Web Site داشته باشیم و طبیعتا محدود به Sandbox مرورگر هست
با Blazor Hybird هم Android / iOS / Windows app داریم که دسترسی به امکانات سیستم عامل هست که UI با HTML / CSS زده میشه
یا Blazor Native شما دیگه UI تون HTML/CSS نیست و برای داشتن TextBox به جای input type=text، از Entry استفاده میکنید برای مثال که پشت صحنه مپ میشه به کنترلهای Native در Android / iOS / Windows
توصیه من این هست که Blazor رو به صورت Multi Mode تنظیم کنید، به صورتی که UI رو با HTML / CSS بزنید، و هم خروجی Android بگیرید و هم iOS و Web و ویندوز
برای درک بهتر این مسئله میتونید وبینارم رو در رابطه با what's new in dotnet 6 ببینید
یا Blazor Native شما دیگه UI تون HTML/CSS نیست و برای داشتن TextBox به جای input type=text، از Entry استفاده میکنید برای مثال که پشت صحنه مپ میشه به کنترلهای Native در Android / iOS / Windows
توصیه من این هست که Blazor رو به صورت Multi Mode تنظیم کنید، به صورتی که UI رو با HTML / CSS بزنید، و هم خروجی Android بگیرید و هم iOS و Web و ویندوز
برای درک بهتر این مسئله میتونید وبینارم رو در رابطه با what's new in dotnet 6 ببینید