سورس فایل jquery.unobtrusive-ajax.js به همراه پروژههای MVC موجود است. میتوانید موارد مدنظر رو در اون بررسی کنید، مثلا نحوه انتقال اطلاعات یا نحوه گوش فرا دادن به دکمه submit در آن. سورس باز هم هست. تغییرش بدید، بعد نتایج رو برای حذف کدهای تکراری کپسوله کنید (اصل بحث جاری).
نظرات اشتراکها
پیش نمایش Rider 2019.1
من این ide رو نصب کردم و از آن هرازگاهی استفاده میکنم، چندتا از ویزگیهاش(هم مثبت و هم منفی) که الان به ذهنم میرسه رو عرض میکنم:
1- توی لود پروژه هایی که تعداد فایل زیادی دارند خیلی کند هست. الان مدتی هست که روی یک پروژه روی asp.net mvc core 2 کار میکنم، تعداد فایلهای آن ذاتاً زیاد است، و چندتا پروژه اوپن سورس هم که بهش اضافه کردم تعداد فایل بیشتر هم شده و rider واقعاً در بحث لود کردن و ایندکسینگ بسیار کند عمل میکنه.(البته اگر هارد ssd داشته باشید فکر نکنم مشکلی باشه)
2- برای کسی که سالها با visual studio کار کرده برقراری ارتباط با آن کمی مشکل هست، مخصوصاً در بحث go to definition و ...
3-حتماً باید ram سیستم در حد مطلوب باشد، درسته حجم خود نرم افزار نسبت به vs بسیار کمه اما در زمان اجرا واقعاً رم بسیار زیادی میگیره.
4- گاهی خطاهایی در زمان debug میگیره که در visual studio اتفاق نمیافته
5- چون resharper رو ذاتاً در خودش داره توی refactoring و بهینه کردن کدها بسیار کمک میکنه.
6- بنده توی خطایابی و رفع خطاهای موجود در کدها در visual studio راحتتر هستم، مخصوصاً بعد از نصب ابزارهای roslyn به نظرم visual studio راحتتر عمل میکنه.
7- واقعاً find در visual studio نسبت به find این ide حرفی برای گفتن نداره، البته بنده گاهی که نیاز به جستجوی سریع و پیچیده دارم از هیچکدوم استفاده نمیکنم در این مواقع از sublime text استفاده میکنم
8- در زمینه کار با سیستمهای version control به نظرم هردو امکانات خوب و کاملی دارند، منتها به سبب عادت من با visual studio راحت ترم.
9- با همه اینها فکر میکنم اگر عادت کنیم rider یک ide قابل تحسینیه، و با بهبودهایی که خواهد داشت مطمئنا برای dotnet core یک ide پرطرفداری خواهد بود
یک نکته تکمیلی
در مطلب فوق یک چنین تعریفی را مشاهده نمودید:
در پوشه content، فایلهای bootstrap.css و bootstrap.min.css هر دو با هم وجود دارند (اگر بسته نیوگت آنرا نصب کنید).
در این بین، اگر فایل bootstrap.css را اندکی ویرایش کنید (مثلا نام فونتها یا اندازه آنها را تغییر دهید)، متوجه خواهید شد که تغییرات شما اصلا اعمال نمیشوند. علت چیست؟!
سیستم Bundling به صورت هوشمند در صورت وجود فایلهای css.min، از آنها استفاده خواهد کرد (حتی در حالت دیباگ) و نه از فایل bootstrap.css ذکر شده در تنظیمات. به همین جهت ممکن است مدتی سر درگم شوید که چرا هر تغییری را که اعمال میکنم، تاثیری ندارد!
بنابراین یا فایلهای css.min را حذف کنید و یا مکان آنها را تغییر دهید تا در کنار فایلهای غیرفشرده شده پیش فرض نباشند.
در مطلب فوق یک چنین تعریفی را مشاهده نمودید:
@BundleConfig.AddStyles("~/Content/css", "~/Content/bootstrap.css", "~/Content/bootstrap-responsive.css", "~/Content/Site.css" )
در این بین، اگر فایل bootstrap.css را اندکی ویرایش کنید (مثلا نام فونتها یا اندازه آنها را تغییر دهید)، متوجه خواهید شد که تغییرات شما اصلا اعمال نمیشوند. علت چیست؟!
سیستم Bundling به صورت هوشمند در صورت وجود فایلهای css.min، از آنها استفاده خواهد کرد (حتی در حالت دیباگ) و نه از فایل bootstrap.css ذکر شده در تنظیمات. به همین جهت ممکن است مدتی سر درگم شوید که چرا هر تغییری را که اعمال میکنم، تاثیری ندارد!
بنابراین یا فایلهای css.min را حذف کنید و یا مکان آنها را تغییر دهید تا در کنار فایلهای غیرفشرده شده پیش فرض نباشند.
مطالب
JSLint.VS
JSLint.VS افزونهای است رایگان برای VS.Net2005/2008 جهت بررسی سادهتر مشکلات دستوری در فایلهای JavaScript یک پروژه.
اکنون بجای اینکه در مرورگر به دنبال خطاهای گزارش شده بگردیم، میتوان پیش از بررسی نهایی آنها، در VS.Net مشکلات ممکن را یافته و برطرف ساخت.
JSLint.VS به منوی کلیک راست بر روی یک فایل js اضافه میشود و یا در حالت انتخاب قطعهای کد و سپس کلیک راست و بررسی مشکلات موجود و یا در حالت یکپارچه با امکانات build پروژه قابل استفاده است (برای یکپارچه سازی با Build باید به منوی Tools قسمت JSLint.VS options مراجعه کرد و سپس گزینه build را درصفحه ظاهر شده تیک زد).
پس از دریافت آن، محتویات پوشه bin آنرا در مسیر زیر کپی نمائید:
%My Documents%/Visual Studio 2008/Addins
Or
%My Documents%/Visual Studio 2005/Addins
نظرات مطالب
ASP.NET MVC #23
بستههای کامل MVC نصب هستند روی سرور؟
ELMAH را به برنامه اضافه کنید تا جزئیات خطاها را بهتر بتوانید لاگ و مشاهده کنید (مهم).
همچنین این خطاها در قسمت لاگهای سرور هم ثبت میشوند که بهتر است جزئیات آنها را بررسی کنید.
ELMAH را به برنامه اضافه کنید تا جزئیات خطاها را بهتر بتوانید لاگ و مشاهده کنید (مهم).
همچنین این خطاها در قسمت لاگهای سرور هم ثبت میشوند که بهتر است جزئیات آنها را بررسی کنید.
نظرات مطالب
غنی سازی کامپایلر C# 9.0 با افزونهها
یک نکتهی تکمیلی: چگونه یک پروژه یا پوشهی خاصی را از ارثبری editorconfig. خارج کنیم؟
زمانیکه فایل editorconfig. در ریشهی solution قرار میگیرد، تنظیمات آن به کل زیر پوشههای موجود نیز اعمال میشود. اگر میخواهید پوشه یا پروژهی خاصی از حالت ارثبری این تنظیمات خارج شود، میتوان یک سطر زیر را به editorconfig. جدید و خاص آن پوشه اضافه کرد:
# Remove the line below if you want to inherit .editorconfig settings from higher directories root = true
وبلاگهای ایرانی
- گزارشی از PDC 2008 microsoftpdc.com و یک سری ویدیوی مرتبط با دات نت
Visual Studio
- ویژوال استودیو 2010 و دات نت فریم ورک 4، نگارش CTP برای دریافت!
- و تازههای آن (توسط یکی از اعضای اصلی تیم NHibernate)
- دمویی از ایجاد نمودارهای UML با VS.Net 2010 . (خوشبختانه حجم این مورد در مقایسه با دموهای PDC2008 بسیار کمتر است!)
امنیت اطلاعات
ASP. Net
- نگارش CTP2 پروژهVelocity . (این پروژه قرار است راه حل جامع caching مایکروسافت برای ASP.Net باشد)
طراحی وب
اسکیوال سرور
به روز رسانیها
- سرویس پک 3 بتا اس کیوال سرور 2005 هم ارائه شد (نگارش نهایی آن تا پایان سال جاری میلادی ارائه میشود.)
ابزارها
- مجموعه CodeRush یک نگارش express رایگان نیز ارائه داد. (به نظر من نگارش کامل آن بهترین ابزار refactoring برای VS.Net است)
سیشارپ
- ویژگیهای جدید C# 4.0 ، قسمت اول، واژه کلیدی جدیدی به نام dynamic
- ویژگیهای جدید C# 4.0 ، قسمت دوم، پارامترهای پیش فرض (یا آرگومانهای اختیاری). (چیزی شبیه به VB !! بدون نیاز به overloading برای پیاده سازی آن)
دلفی
- محصور کننده جدید SQLite برای دلفی 2009 (رفع مشکلات عدم سازگاری نگارش قبلی با سیستم یونیکد دلفی 2009)
- ویدیویی از Delphi Prism . (نگارشی از دلفی که به شکل افزونهای کاملا یکپارچه در VS.Net قابل دسترسی است)
SharePoint
- سطوح دسترسی کدها در SharePoint . (به شکل زیبایی این مساله را که مشکل اولیه اکثر وب پارت نویسها است توضیح داده است)
ویندوز
متفرقه
در کنار کتابخانه elmah که وظیفه ثبت تمامی خطاهای برنامه را دارد کتابخانه MiniProfiler امکان یافتن مشکلات کارایی و تنگناهای وب سایت را در اختیارمان قرار میدهد. دو قابلیت عمده که این ابزار فراهم مینمایید
در ASP.NET MVC در صفحه Layout_ قبل از بسته شدن تگ body تابع RenderIncludes را مانند زیر صدا بزنید تا در همه صفحات نمایش داده شود
در کلاس global کد زیر را برای اجرای MiniProfiler اضافه نمایید
یا کتابخانه MiniProfiler.MVC را از nuget دریافت نمایید
با اضافه شدن این کتابخانه همه پیکربندی بصورت صورت خودکار انجام میگیرد. حال وب سایت را اجرا کنید در بالای صفحه مانند شکل زیر مدت زمان بارگذاری صفحه نمایش داده میشود که با کلیک بر روی آن اطلاعات بیشتری را مشاهده مینمایید
- امکان مشاهده و بررسی کوئریهای خام ADO.NET از قبیل SQL Server,Oracle و LINQ-to-SQL و EF/First Code و...
- نمایش زمان اجرای عملی صفحات
برای استفاده از این ابزار کافیست تا آن را از nuget دریافت نمایید
PM> Install-Package MiniProfiler
@using StackExchange.Profiling; <head> .. </head> <body> ... @MiniProfiler.RenderIncludes() </body>
protected void Application_BeginRequest() { if (Request.IsLocal) { MiniProfiler.Start(); } } protected void Application_EndRequest() { MiniProfiler.Stop(); }
برای پیکربندی MiniProfiler در web.config کد زیر را اضافه نمایید
<system.webServer> ... <handlers> <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" /> </handlers> </system.webServer>
PM> Install-Package MiniProfiler.MVC
اگر در اکشن اجرا شده کوئری اجرا شد باشد ستونی به نام query times نمایش داده میشود که تعداد کوئریها و مدت زمان آن را نمایش میدهد
حال بر روی گزینه sql کلیک کنید که صفحه دیگری باز شود و کوئری خام آن را مشاهد نمایید اگر کوئری تکرار شده باشد در کنار آن با DUPLICATE متمایز شده است
برای مشاهده کوئریهای Entity Framework/First Code کتابخانه MiniProfiler.EF را اضافه نمایید
PM> Install-Package MiniProfiler.EF
اگر بصورت دستی MiniProfiler را پیکربندی کرده باشید میبایست در Application_Start دستور زیر را اجرا نمایید
protected void Application_BeginRequest() { if (Request.IsLocal) { MiniProfiler.Start(); MiniProfilerEF.Initialize(); } }
در حالت پبشرفتهتر اگر قصد داشته باشید زمان یک قطعه کد را جداگانه محاسبه نمایید بصورت زیر عمل نمایید
public ActionResult Index() { var profiler = MiniProfiler.Current; using (profiler.Step("Step 1")) { //code 1 } using (profiler.Step("Step 2")) { //code 2 } return View(); }
با این کار زمان هر step را بصورت جداگانه محاسبه مینماید. در ASP.NET Webforms دقیقا به همین صورت استفاده میشود فقط کافیست در masterpage اصلی یا اگر از masterpage استفاده نمیکنیم در صفحه مورد نظر تابع RenderIncludes را بصورت زیر صدا بزنیم
<%= StackExchange.Profiling.MiniProfiler.RenderIncludes() %>
امیدوارم مفید واقع شده باشد.
زمانیکه از Templateهای پیش فرض تدارک دیده شده در VS.Net برای اپلیکیشنهای وب خود استفاده میکنید، وب اپلیکیشن و سرور با هم یکپارچه هستند و تحت IIS اجرا میشوند. به وسیله Owin میتوان این دو مورد را بدون وابستگی به IIS به صورت مجزا اجرا کرد. در این پست قصد داریم سرویسهای Web Api را در قالب یک Windows Service با استفاده از کتابخانهی TopShelf هاست نماییم.
پیش نیاز ها:
»Owin چیست
»تبدیل برنامههای کنسول ویندوز به سرویس ویندوز ان تی
برای شروع یک برنامه Console Application ایجاد کرده و اقدام به نصب پکیجهای زیر نمایید:
حال یک کلاس Startup برای پیاده سازی Configurationهای مورد نیاز ایجاد میکنیم
در این قسمت میتوانید تنظیمات زیر را پیاده سازی نمایید:
»سیستم Routing؛
»تنظیم Dependency Resolver برای تزریق وابستگی کنترلرهای Web Api؛
»تنظیمات hubهای SignalR(در حال حاضر SignalR به صورت پیش فرض نیاز به Owin برای اجرا دارد)؛
»رجیستر کردن Owin Middlewareهای نوشته شده؛
»تغییر در Asp.Net PipeLine؛
»و...
* به صورت پیش فرض نام این کلاس باید Startup و نام متد آن نیز باید Configuration باشد.
در این مرحله یک کنترلر Api به صورت زیر به پروژه اضافه نمایید:
کلاسی به نام ServiceHost ایجاد نمایید و کدهای زیر را در آن کپی کنید:
واضح است که متد Start در کلاس بالا با استفاده از متد Start کلاس WebApp، سرویسهای Web Api را در آدرس مورد نظر هاست خواهد کرد. با فراخوانی متد Stop این سرویسها نیز dispose خواهند شد.
در مرحله آخر باید شروع و توقف سرویسها را تحت کنترل کلاس HostFactory کتابخانه TopShelf در آوریم. برای این کار کافیست کلاسی به نام ServiceHostFactory ایجاد کرده و کدهای زیر را در آن کپی نمایید:
توضیح کدهای بالا:
پیش نیاز ها:
»Owin چیست
»تبدیل برنامههای کنسول ویندوز به سرویس ویندوز ان تی
برای شروع یک برنامه Console Application ایجاد کرده و اقدام به نصب پکیجهای زیر نمایید:
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost Install-Package TopShelf
حال یک کلاس Startup برای پیاده سازی Configurationهای مورد نیاز ایجاد میکنیم
در این قسمت میتوانید تنظیمات زیر را پیاده سازی نمایید:
»سیستم Routing؛
»تنظیم Dependency Resolver برای تزریق وابستگی کنترلرهای Web Api؛
»تنظیمات hubهای SignalR(در حال حاضر SignalR به صورت پیش فرض نیاز به Owin برای اجرا دارد)؛
»رجیستر کردن Owin Middlewareهای نوشته شده؛
»تغییر در Asp.Net PipeLine؛
»و...
public class Startup { public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); } }
در این مرحله یک کنترلر Api به صورت زیر به پروژه اضافه نمایید:
public class ValuesController : ApiController { public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } public string Get(int id) { return "value"; } public void Post([FromBody]string value) { } public void Put(int id, [FromBody]string value) { } }
public class ServiceHost { private IDisposable webApp; public static string BaseAddress { get { return "http://localhost:8000/"; } } public void Start() { webApp = WebApp.Start<Startup>(BaseAddress); } public void Stop() { webApp.Dispose(); } }
در مرحله آخر باید شروع و توقف سرویسها را تحت کنترل کلاس HostFactory کتابخانه TopShelf در آوریم. برای این کار کافیست کلاسی به نام ServiceHostFactory ایجاد کرده و کدهای زیر را در آن کپی نمایید:
public class ServiceHostFactory { public static void Run() { HostFactory.Run( config => { config.SetServiceName( "ApiServices" ); config.SetDisplayName( "Api Services ]" ); config.SetDescription( "No Description" ); config.RunAsLocalService(); config.Service<ServiceHost>( cfg => { cfg.ConstructUsing( builder => new ServiceHost() ); cfg.WhenStarted( service => service.Start() ); cfg.WhenStopped( service => service.Stop()); } ); } ); } }
ابتدا با فراخوانی متد Run سرویس مورد نظر اجرا خواهد شد. تنظیمات نام سرویس و نام مورد نظر جهت نمایش و همچنین توضیحات در این قسمت انجام میگیرد.
با استفاده از متد ConstructUsing عملیات وهله سازی از سرویس انجام خواهد گرفت. در پایان نیز متد Start و Stop کلاس ServiceHost، به عنوان عملیات شروع و پایان سرویس ویندوز مورد نظر تعیین شد.
حال اگر در فایل Program پروژه، دستور زیر را فراخوانی کرده و برنامه را ایجاد کنید خروجی زیر قابل مشاهده است.
با استفاده از متد ConstructUsing عملیات وهله سازی از سرویس انجام خواهد گرفت. در پایان نیز متد Start و Stop کلاس ServiceHost، به عنوان عملیات شروع و پایان سرویس ویندوز مورد نظر تعیین شد.
حال اگر در فایل Program پروژه، دستور زیر را فراخوانی کرده و برنامه را ایجاد کنید خروجی زیر قابل مشاهده است.
ServiceHostFactory.Run();
در حالیکه سرویس مورد نظر در حال اجراست، Browser را گشوده و آدرس http://localhost:8000/api/values/get را در AddressBar وارد کنید. خروجی زیر را مشاهده خواهید کرد:
یک گزینهی «هیچکدام» را هم اگر اضافه میکردید، بهتر میشد. چون WPF هدفش حذف این بستههای کامپوننت است و به شخصه تا به امروز فقط از یک سری template تغییر رنگ و شکل ظاهری کنترلهای استاندارد آن، از مورد دیگری استفاده نکردهام. یعنی واقعا نیازی نیست. تمام کنترلهای آن قابلیت سفارشی سازی کامل را دارند و همچنین اندکی هم جستجو کنید تمام آنها را با مثالهای فراوانی میتوانید پیدا کنید. این بستههای کامپوننت هم در کل چیزی نیستند به جز جمع آوری این مقالات و نظم دادن به آنها. یک نمونهی آن «Extended WPF Toolkit™ Community Edition » هست.