با یک پسوند دیگر که نمیشناسند تست کنید؛ مثلا filename=test.abc
نظرات مطالب
یکپارچه سازی CKEditor با Lightbox
سلام
با فایرفاکس تست کنید تا اگه مشکلی داشتید راهنمایی کنم.
قبل از اینکه به httpmoduleها بپردازیم، اجازه بدید کمی در در مورد httphandler اطلاعات کسب کنیم. httphandler ویژگی است که از asp.net به بعد ایجاد شد و در asp کلاسیک خبری از آن نیست.
یک httphandler کامپوننتی است که از طریق اینترفیس System.Web.IHttpHandler پیاده سازی میشود و به پردازش درخواستهای رسیده از httprequest رسیدگی میکند.
فرض کنید کاربری درخواست صفحه default.aspx را کرده است و سرور هم پاسخ آن را میدهد. در واقع پردازش اینکه چه پاسخی باید به کاربر یا کلاینت ارسال شود بر عهده این کامپوننت میباشد. برای وب سرویس هم موضوع به همین صورت است؛ هر نوع درخواست HTTP از این طریق انجام میشود.
حال به سراغ httpmodule میرویم. httpmoduleها اسمبلی یا ماژولهایی هستن که بر سر راه هر درخواست کاربر از سرور قرار گرفته و قبل از اینکه درخواست شما به httphandler برسد، اول از فیلتر اینها رد میشود. در واقع موقعی که شما درخواست صفحه default.aspx را میکنید، درخواست شما به موتور asp.net ارسال میشود و از میان فیلترهایی رد میشود تا به دست httphandler برای پردازش خروجی برسد. برای همین اگر گاهی به جای گفتن asp.net engine عبارت asp.net pipeline هم میگویند همین هست؛ چون درخواست شما از بین بخشهای زیادی میگذرد تا به httphandler برسد که httpmodule یکی از آن بخش هاست. با هر درخواستی که سرور ارسال میشود، httpmoduleها صدا زده میشوند و به برنامه نویس امکان بررسی اطلاعات درخواستی و پردازش درخواستها را در ورودی و خروجی، میدهد و شما میتوانید هر عملی را که نیاز دارید انجام دهید. تعدادی از این ماژولهای آماده، همان stateها و Authentication میباشند.
تصویر زیر نحوهی ارسال و بازگشت یک درخواست را به سمت httphandler نشان میدهد
برنامه نویس هم میتواند با استفاده از اینترفیسهای IHttpModule و IHttpHandler در درخواستها دخالت نماید.
برای شروع یک کلاس ایجاد کنید که اینترفیس IHttpModule را پیاده سازی میکند. شما دو متد را باید در این کلاس بنویسید؛ یکی Init و دیگر Dispose. همانطور که مطلع هستید، اولی در ابتدای ایجاد شیء و دیگر موقع از دست رفتن شی صدا زده میشود.
متد Init یک آرگومان از نوع httpapplication دارد که مانند رسم نامگذاری متغیرها، بیشتر به اسم context یا app نام گذاری میشوند:
public void Init(HttpApplication app) { app.BeginRequest += new EventHandler(OnBeginRequest); } public void Dispose(){ }
BeginRequest | این رویداد اولین رویدادی است که اجرا میشود، هر نوع عملی که میخواهید در ابتدای ارسال درخواست انجام دهید، باید در این قسمت قرار بگیرد؛ مثلا قرار دادن یک بنر بالای صفحه |
AuthenticateRequest | خود دانت از یک سیستم امنیتی توکار بهره مند است و اگر میخواهید در مورد آن خصوصی سازی انجام بدهید، این رویداد میتواند کمکتان کند |
AuthorizeRequest | بعد از رویداد بالا، این رویداد برای شناسایی انجام میشود. مثلا دسترسی ها؛ دسترسی به قسمت هایی خاصی از منابع به او داده شود و قسمت هایی بعضی از منابع از او گرفته شود. |
ResolveRequestCache | این رویداد برای کش کردن اطلاعات استفاده میشود. خود دانت تمامی این رویدادها را به صورت تو کار فراهم آورده است؛ ولی اگر باز خصوصی سازی خاصی مد نظر شماست میتوانید در این قسمتها، تغییراتی را اعمال کنید. مثلا ایجاد file caching به جای memory cache و ... |
AcquireRequestState | این قسمت برای مدیریت state میباشد مثلا مدیریت session ها |
PreRequestHandlerExecute | این رویداد قبل از httphandler اجرا میشود. |
PostRequestHandlerExecute | این رویداد بعد از httphandler اجرا میشود. |
ReleaseRequestState | این رویداد برای این صدا زده میشود که به شما بگوید عملیات درخواست پایان یافته است و باید stateهای ایجاد شده را release یا رها کنید. |
UpdateRequestCache | برای خصوصی سازی output cache بکار میرود. |
EndRequest | عملیات درخواست پایان یافته است. در صورتیکه قصد نوشتن دیباگری در طی تمامی عملیات دارید، میتواند به شما کمک کند. |
PreSendRequestHeaders | این رویداد قبل از ارسال طلاعات هدر هست. اگر قصد اضافه کردن اطلاعاتی به هدر دارید، این رویداد را به کار ببرید. |
PreSendRequestContent | این رویداد موقعی صدا زده میشود که متد response.flush فراخوانی شود.، اگر میخواهید به محتوا چیزی اضافه کنید، از اینجا کمک بگیرید. |
Error | این رویداد موقعی رخ میدهد که یک استثنای مدیریت نشده رخ بدهد. برای نوشتن سیستم خطایابی خصوصی از این قسمت عمل کنید. |
Disposed | این رویداد موقعی صدا زده میشود که درخواست، بنا به هر دلیلی پایان یافته است. برای عملیات پاکسازی و .. میشود از آن استفاده کرد. مثلا یک جور rollback برای کارهای انجام گرفته. |
کد زیر را در نظر بگیرید:
کد زیر یک رویداد را تعریف کرده و سپس خود httpapplication را به عنوان sender استفاده میکند.
در اینجا قصد داریم یکی از صفحات را در خروجی تغییر دهیم. آدرس تایپ شده همان باشد ولی صفحهی درخواست شده، صفحهی دیگری است. این کار موقعی بیشتر کاربردی است که آدرس یک صفحه تغییر کرده و کاربر آدرس قبلی را وارد میکند. حالا یا از طریق بوک مارک یا از طریق یک لینک، در یک جای دیگر و شما میخواهید او را به صفحهای جدید انتقال دهید، ولی در نوار آدرس، همان آدرس قبلی باقی بماند. همچنین کار دیگری که قرار است انجام بگیرد محاسبه مدت زمان رسیدگی به درخواست را محاسبه کند ، برای همین در رویداد BeginRequest زمان شروع درخواست را ذخیره و در رویداد EndRequest با به دست آوردن اختلاف زمان فعلی با زمان شروع به مدت زمان مربوطه پی خواهیم برد.
با استفاده از app.Context.Request.RawUrl آدرس اصلی و درخواست شده را یافته و در صورتی که شامل نام صفحه مربوطه بود، با نام صفحهی جدید جابجا میکنیم تا اطلاعات به صفحهی جدید پاس شوند ولی در نوار آدرس، هنوز آدرس قبلی یا درخواست شده، قابل مشاهده است.
در خط ["app.Context.Items["start که یک کلاس ارث بری شده از اینترفیس IDictionary است، بر اساس کلید، داده شما را ذخیره و در مواقع لزوم در هر رویداد به شما باز میگرداند.
public class UrlPath : IHttpModule { public void Init(HttpApplication app) { app.BeginRequest+=new EventHandler(_BeginRequest); app.EndRequest+=new EventHandler(_EndRequest); } public void Dispose() { } void _BeginRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication) sender; app.Context.Items["start"] = DateTime.Now; if (app.Context.Request.RawUrl.ToLower().Contains("tours_list.aspx")) { app.Context.RewritePath(app.Context.Request.RawUrl.ToLower().Replace("tours_list.aspx","tours_cat.aspx")); } } void _EndRequest(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; string log = (DateTime.Now - DateTime.Parse(app.Context.Items["start"].ToString())).ToString(); Debugger.Log(0,"duration","request took " + log+Environment.NewLine); } }
<httpModules> <add name="UrlPath" type="UrlPath"/> </httpModules>
اگر کلاس شما داخل یک namespace قرار دارد، در قسمت type حتما قبل از نام کلاس، آن را تعریف کنید namspace.ClassName
حالا دیگر کلاس UrlPath به عنوان یک httpmodule به سیستم معرفی شده است. تگ httpmodule را بین تگ <system.web> قرار داده ایم.
در ادامه پروژه را start بزنید تا نتیجه کار را ببینید:
اگر IIS شما، هم نسخهی IIS من باشد، نباید تفاوتی مشاهده کنید و میبینید که درخواستها هیچ تغییری نکردند؛ چرا که اصلا httpmodule اجرا نشده است. در واقع در نسخههای قدیمی IIS یعنی 6 به قبل، این تعریف درست است ولی از نسخهی 7 به بعد IIS، روش دیگری برای تعریف را قبول دارد و باید تگ httpmodule، بین دو تگ <syste.webserver> قرار بگیرد و نام تگ httpmodule به module تغییر پیدا کند.
پس کد فوق به این صورت تغییر میکند:
<system.webServer> <modules> <add name="UrlRewrite" type="UrlRewrite"/> </modules> </system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
HTTP Error 500.22 - Internal Server Error
در کل استفاده از این ماژول به شما کمک میکند تمامی اطلاعات ارسالی به سیستم را قبل از رسیدن به قسمت پردازش بررسی نمایید و هر نوع تغییری را که میخواهید اعمال کنید و لازم نیست این تغییرات را روی هر بخش، جداگانه انجام دهید یا یک کلاس بنویسید که هر بار در یک جا صدا بزنید و خیلی از موارد دیگر
Global.asax و HttpModule
اگر با global.asax کار کرده باشید حتما میپرسید که الان چه تفاوتی با httpmodule دارد؟ در فایل global هم همینها را دارید و دقیقا همین مزایا مهیاست؛ در واقع global.asax یک پیاده سازی از httpapplication هست.
کلاسهای httpmodule نام دیگری هم دارند به اسم Portable global .asax به معنی یک فایل global.asax قابل حمل یا پرتابل. دلیل این نام گذاری این هست که شما موقعی که یک کد را در فایل global مینویسید، برای همیشه آن کد متعلق به همان پروژه هست و قابل انتقال به یک پروژه دیگر نیست ولی شما میتوانید httpmoduleها را در قالب یک پروژه به هر پروژه ای که دوست دارید رفرنس کنید و کد شما قابلیت استفاده مجدد و Reuse پیدا میکند و هم اینکه در صورت نیاز میتوانید آنها را در قالب یک dll منتشر کنید.
با سلام؛ فرض کنید در یک فرم ثبت محصول، فیلد عنوان محصول و آپلود تصویر را داریم و یک دکمه آپلود فایل برای آپلود تصویر و یک دکمه برای ثبت محصول. یک حالت این است که کاربر تصویر را آپلود کند و بعد عنوان را پر کند و در نهایت دکمه ثبت را بزند، ولی فکر کنید کاربر تصویر را آپلود میکند و به هر دلیلی عنوان را پر نمیکند و دکمه ثبت را نمیزند؛ حال تکلیف تصویر آپلود شده چه میشود؟ آیا راهی وجود دارد برای حل این مشکل؟
دوستان فرق linkFileUpload و fileUpload چیه و با کدوم دکمه فعال میشه؟
سلام آقای نصیری
امکان داره توضیح بدید چگونه دکمه Code و به این ادیتور اضافه کنیم ؟!
امکان داره توضیح بدید چگونه دکمه Code و به این ادیتور اضافه کنیم ؟!
پاسخ به بازخوردهای پروژهها
در صورت امکان فایل مستندات کدها قرار داده شود
روی فایل کلیک راست کرده و روی دکمه unblock کلیک کنید. فایلهای chm دریافتی از اینترنت به همین نحو هستند.
در قسمت قبل، محیط توسعه نرم افزار مد نظرمان را ایجاد کردیم و توانستیم پروژه پیش فرض Xamarin forms را بیلد کنیم. حالا قصد داریم تا یک مثال ساده را با هم بررسی کنیم و آن را بر روی ویندوز تست کنیم. در قسمت بعدی نیز همین مثال ساده را بر روی Android و در قسمت بعدتر نیز بر روی iOS تست میکنیم. پس از اطمینان از اینکه امکان تست برنامه را بر روی هر سه پلتفرم یافتهاید، بر روی آموزش موارد بیشتری از Xamarin Forms تمرکز میکنیم.
برای شروع، Xaml Live را از Visual Studio Marketplace دانلود کنید.
سپس در صورتیکه ابزار git را ندارید، آن را نیز دانلود و نصب کنید و بعد دستور git clone https://github.com/ysmoradi/XamApp را در Command line وارد کنید. دقت کنید پروژه را در جایی Clone نکنید که مسیر فولدر آن طولانی شود. این پروژه، یک پروژه آماده برای تست و تغییر است و ما برای بررسی نحوه اجرا آن در UWP - Android - iOS از آن استفاده میکنیم. خود کدها در جلسات بعدتر بررسی خواهند شد. تنها چیزی که الآن اهمیت دارد اطمینان از راه اندازی شدن محیط توسعه نرم افزار شما به بهترین شکل ممکن است.
با ساختار پروژه و جزئیات آن در گذر زمان بیشتر آشنا میشویم، ولی به صورت کلی این Solution دارای 4 پروژه است:
XamApp - XamApp.Android - XamApp.iOS - XamApp.UWP
- در XamApp، تقریبا تمامی پروژه نوشته میشود. این مورد شامل منطق برنامه است که با CSharp نوشته میشود و ظاهر برنامه که با XAML نوشته میشود. اگر چه که میتوان ظاهر برنامه را نیز با CSharp زد، انجام این کار به هیچ وجه توصیه نمیشود. در مورد Xaml نیز بعد از راه اندازی این مثال در Windows-Android-iOS صحبت خواهیم کرد.
- XamApp.Android پروژهای است که اگر Set as start up project شود، به شما اجازه تست کدهای داخل XamApp را بر روی گوشی یا Emulatorهای اندرویدی میدهد. همچنین از طریق این پروژه میتوانید پابلیش apk را بگیرید و به امکانات پایه Android مانند Activity - Fragment - Android XML - Intent و ... در همان زبان CSharp دسترسی داشته باشید. استفاده از این پروژه، مطلب قسمت بعدی این دوره آموزشی است.
- XamApp.iOS پروژهای است که اگر Set as start up project شود، به شما اجازه تست کدهای داخل XamApp را بر روی گوشی یا Emulatorهای iOS ای میدهد. همچنین از طریق این پروژه میتوانید پابلیش ipa را بگیرید و به امکانات پایه iOS مانند Delegate - Storyboard و ... در همان زبان CSharp دسترسی داشته باشید. در آموزش بعد از آموزش Android، به iOS نیز خواهیم پرداخت.
- XamApp.UWP پروژهای است که اگر Set as start up project شود، به شما اجازه تست کدهای داخل XamApp را بر روی ویندوز خودتان میدهد. همچنین از طریق این پروژه میتوانید پابلیش appxbundle یا msi را بگیرید و به امکانات پایه Windows در همان زبان CSharp دسترسی داشته باشید. UWP مخفف Universal windows platform است.
برای شروع پروژههای XamApp.Android و XamApp.iOS را Unload کنید، زیرا در این قسمت با آنها کاری نداریم. همچنین پروژه XamApp.UWP را Set as start up project کنید.
فقط برای یکبار از منوی Tools در ویژوال استدیو، Options را باز کنید و در قسمت جستجوی آن، عبارت Intellitrace را بنویسید و اگر چیزی پیدا شد، تیک Enable Intellitrace را بردارید تا غیر فعال شود. همچنین مجدد Suppress JIT optimization را جستجو کنید و تیک آن را بزنید تا فعال شود.
دکمه F5 را بزنید و برنامه را اجرا کنید. یک دکمه میبینید که Text آن عبارت + است. اگر بر روی آن کلیک کنید، میبینید که متن Label بالای آن میشود Button tapped 1 time
فایل HelloWorldView.xaml را در فولدر Views در پروژه XamApp، پیدا کنید و نگاهی به کد Label و Button بیاندازید که درون StackLayout هستند و StackLayout خود داخل ContentPage است که در نتیجه صفحه اول ما کل فضایی را که دارد، به StackLayout اختصاص یافتهاست.
<StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label Text="{Binding StepsCount, StringFormat='{}Button tapped {0} times!'}" /> <Button Command="{Binding IncreaseStepsCountCommand}" Text="+" /> </StackLayout>
Label ما دارای Text ای است که به StepsCount متصل یا Bind شده است ( به کمک Binding StepsCount).
StepsCount عددی است که در ابتدا صفر است و با کلیک دکمه، مقدار آن یکی یکی افزایش مییابد. این کد در HelloWorldViewModel.cs و به زبان CSharp نوشته شدهاست. StringFormat نیز در اینجا عملکردی معادل StringFormat در CSharp را دارد.
Button دارای Command ای است که به متدی در CSharp به نام IncreaseStepsCount متصل شدهاست.
حال نگاهی به کد CSharp بیندازیم:
public class HelloWorldViewModel : BitViewModelBase { public int StepsCount { get; set; } public BitDelegateCommand IncreaseStepsCountCommand { get; set; } public HelloWorldViewModel() { IncreaseStepsCountCommand = new BitDelegateCommand(IncreaseStepsCount); } async Task IncreaseStepsCount() { StepsCount += 1; } }
StepsCount که در View به Text آن Label وصل شده بود، در CSharp یک Property از جنس int است. Command ما با نام IncreaseStepsCountCommand به متدی وصل شدهاست که کارش اضافه کردن یکی یکی StepsCount است.
در حالت عادی اگر بخواهید این برنامه را تغییر دهید که مثلا به جای یکی یکی بالا بردن StepsCount، آن را یکی یکی کم کند، ابتدا برنامه را Stop میکنید و سپس در Xaml برای Button مربوطه، Text را از + به - تغییر میدهید. همچنین کد CSharp را نیز عوض میکنید که میشود:
StepsCount -= 1
و مجددا F5 را میزنید. این روش قطعا خیلی Productive نیست و زمان زیادی را از شما میگیرد. شما میتوانید با Break کردن اجرای برنامه به تغییر کدهای CSharp بپردازید. همچنین بدون Break کردن میتوانید کدهای Xaml را تغییر دهید و به این روی، خیلی سریعتر پروژه را پیش ببرید.
با مشاهده این ویدئو می توانید درک بهتری از عملکرد Edit & continue داشته باشید. دقت کنید که در زمان تغییر ظاهر و منطق، اگر مثلا عدد، تا 17 افزایش داده شده بود برای تست، روی 17 میماند و به صفر بر نمیگردد. در واقع کل برنامه Reload نمیشود و این تفاوت Edit & continue با Hot reload موجود در سایر ابزارهاست.
همچنین با کوچک و بزرگ کردن برنامه اجرا شده به سایز گوشیها و تبلتهای مختلف عملا میتوانید برنامه را در سایزهای مختلف تست کنید. توجه داشته باشید که در Xamarin Forms مقدار دهی به طول و عرض و ... در تمامی پلتفرمها و Deviceها فارغ از Resolution یکسان است و در همه جا Width=64 عملا به یک سانتی متر اشاره دارد. علاوه بر این بدون اینکه صفحه مانیتور شما Touch باشد، میتواند حتی Touch را نیز تست کنید که برای این کار میتوانید از Simulator استفاده کنید. به این صورت که به جای Local Machine گزینه Simulator را انتخاب میکنید.
|
|
برای پابلیش پروژه نیز میتوانید از آموزشهای بر روی وب استفاده کنید که شامل ارائه برنامه به استفاده کنندگان با یا بدون Microsoft Store است که از فرمت نه چندان جالب appxbundle استفاده میکند و ما از این آموزش عبور میکنیم و به ذکر این نکته بسنده میکنیم که نسخه بعدی Visual Studio 2017 یعنی 15.9 قابلیت ساختن msix یا Windows installer را نیز دارد که از هر چیزی بهتر است و برای پابلیش بهتر است تا ارائه نسخه Stable بعدی ویژوال استودیو که احتمالا در طی کمتر از یک ماه دیگر ارائه میشود، صبر کنید. دقت کنید علاوه بر کامپیوتر، لپ تاپ و تبلتهای ویندوزی، برنامهی شما بر روی XBox نیز میتواند کار کند.
در قسمت بعدی، همین پروژه را بر روی Android نیز اجرا میکنیم.
نظرات اشتراکها
froala/wysiwyg-editor 1.2 منتشر شد
من دقیقا همون دستورات رو نوشتم
اما موقعی که اطلاعات فرستاده میشه مقدار null داخل پارامتر file قرار میگیره
توی حالتی که تصویر آپلود کنیم توی قسمت Params ارسالی این اطلاعاتی فرستاده میشه
Content-Disposition: form-data; name="file"; filename="picName.jpg"
اما توی حالت آپلود فایل
Content-Disposition: form-data; name="[object Object]"; filename="1202.pdf"
به اینصورت اطلاعات به اکشن فرستاده میشه
public virtual ActionResult FroalaUploadFile(HttpPostedFileBase file
توی حالتی که تصویر آپلود کنیم توی قسمت Params ارسالی این اطلاعاتی فرستاده میشه
Content-Disposition: form-data; name="file"; filename="picName.jpg"
اما توی حالت آپلود فایل
Content-Disposition: form-data; name="[object Object]"; filename="1202.pdf"
به اینصورت اطلاعات به اکشن فرستاده میشه
اشتراکها
2.Visual Studio 2019 RC منتشر شد
Top Issues Fixed in Visual Studio 2019 RC.2
- Find in files "Locating next match" UI is annoying.
- Find files keeps defaulting to current document.
- Quick references freezes VS 2019 RC.
- PackageId:MsSqlCmdLnUtils;PackageAction:Install;ReturnCode:1603;.
- Error List does not show errors because it is scoped to "Current Document".
- Cannot use conditional breakpoint on PropertyInfo.Name value.
- Visual Studio crashes when parsing macros at the end of a file.
- Search in Visual Studio 2019 is very slow.
- Visual Studio hangs when starting debugging.
- vdproj not supported in Visual Studio 2019 RC.
- Visual Studio installer welcome image contains offensive element for Chinese.
- VSIX Extension pre-req has been removed in Visual Studio 2019 RC breaking extension compatibility.
- Create Project from Start Screen Ignores Selected Project Folder.
- cpp properties is dialog does not show up when using Project menu item or select "Manage configuration" drop down menu.
- Visual Studio 2019 Build Tools - developer prompt title says "Developer Command Prompt for Visual Studio 2017".
- German tranlation regarding the Feedback Tool: Help > Send Feedback > Report a Problem.
- 自动完成功能,如果双击候选项,会丢失输入焦点,需要单机编辑器才能继续输入-AutoComplete function, if you double-click the candidate, will lose the input focus, need a stand-alone editor to continue to enter.
- Context menus are sometimes placed on the wrong monitor in a multiple monitor configuration.
- Visual Studio 2019 conflict with QQ Pinyin.
- Cannot drag maximized Visual Studio window.
- Fixed slow reload of multiple C# and Visual Basic projects.
- When IntelliSense is present, when a user types Shift + Enter, the active selection will be completed and a new line inserted.
- Fixed a PMA issue where editor tooltips and light bulb doesn't render properly.
- Notifications about crashes caused by extensions now show up again.
- Notifications about performance of Visual Studio have been secured against tampering.
- Fixed an issue with toolbar rendering when dragged across displays.
- Fixed an issue with Tools Options rendering when running with per-monitor awareness enabled.
- Various DpiHelper classes has been deprecated (extensibility).
- Fixed splash screen scaling to better match the primary monitor scale factor.
- Fixed an issue in settings import where warnings/errors were not always reported correctly.
- Fixed an issue where Tools Options reported software rendering regardless of rendering tier.
- Fixed an issue where the name of the open folder was not displayed in the title bar region.
- Fixed an issue with find in files positioning when per-monitor awareness is enabled.
- Fixed an issue with dock adorner rendering when per-monitor awareness is enabled.