نظرات مطالب
آموزش LINQ بخش سوم
بله. توضیح دادم چرا. چون طراحی جدول شما اشتباه هست. اگر عدد وارد می‌کنید، نوع فیلد را int تعیین کنید. مابقی آن به صورت خودکار درست می‌شود (و نیازی به هیچ نکته‌ی خاصی هم ندارد). اگر الزامی به ورود رشته هست، باید بجای 10 بنویسید 010 تا مقایسه‌ها درست شوند (این 0‌های پیش از اعداد باید تعداد کاراکترها را به تعداد کاراکترهای بزرگترین عدد رشته‌ای که دارید برساند؛ اگر بزرگترین عدد شد 1000 باید تمام این‌ها را به 0010 اصلاح کنید). چون این‌ها رشته هستند نه عدد. تمام داده‌ها وارد شده هم باید به همین صورت اصلاح شوند. روش دیگر هم این است که مستقیما SQL بنویسید و (cast(code as int کنید. راه دیگری ندارد. حتی کوئری SQL ایی هم که در بالا نوشتید جواب نمی‌دهد چون cast as int ندارد. بنابراین ساده‌ترین و منطقی‌ترین روش، انتخاب نوع فیلد مناسب هست.
SELECT * FROM document WHERE CAST(code AS INT) > 1 and CAST(code AS INT) < 10
نظرات مطالب
نوشتن TagHelperهای سفارشی برای ASP.NET Core
یک نکته‌ی تکمیلی: به روز رسانی یک Tag Helper از طریق Ajax

فرض کنید قسمتی از صفحه را با یک Tag Helper سفارشی ایجاد کرده‌اید. اگر بخواهید یک دکمه‌ی به روز رسانی را هم در اینجا اضافه کنید تا به صورت Ajax ایی این قسمت به روز شود، نیاز است بتوان این تگ هلپر را مجددا تولید کرد و سپس به صورت ()return Content بازگشت داد.
برای اینکار قسمتی که سبب رندر مجدد یک تگ هلپر می‌شود، به صورت زیر قابل پیاده سازی است:
var tagHelper = new MyCustomTagHelper();

var tagHelperContext = new TagHelperContext(
    allAttributes: new TagHelperAttributeList(),
    items: new Dictionary<object, object>(),
    uniqueId: Guid.NewGuid().ToString("N"));
 
var tagHelperOutput = new TagHelperOutput(
    tagName: "div",
    attributes: new TagHelperAttributeList(),
    getChildContentAsync: (useCachedResult, encoder) =>
    {
        var tagHelperContent = new DefaultTagHelperContent();
        tagHelperContent.SetContent(string.Empty);
        return Task.FromResult<TagHelperContent>(tagHelperContent);
    });
 
tagHelper.Process(tagHelperContext, tagHelperOutput);
var content = tagHelperOutput.Content.GetContent();
نظرات مطالب
PersianDatePicker یک DatePicker شمسی به زبان JavaScript که از تاریخ سرور استفاده می‌کند

مشکل از این مثال یا این تقویم یا هیچکدوم نیست. مشکل از اینجا است که در حین Post، سیستم بایندینگ MVC میاد نگاه می‌کنه چه خواصی رو در کلاس PostViewModel داری (اسم این کلاس مهم نیست). زمانی که در اون خاصیت AddDate رو پیدا نکرد، خوب ... همه چیز تموم میشه. خاصیتی رو پیدا نکرده که اطلاعات دریافتی رو بهش بایند کنه، بنابراین خاصیت‌های شیء تو در تویی که درست کردی، خالی باقی می‌مونه. این نوع View مدل بیشتر برای حالت Get استفاده میشه نه حالت Post. برای حالت Get ایی که قراره در یک صفحه چند منبع داده رو به قسمت‌های مختلف اون بایند کنی.

البته MVC می‌تونه به یک شیء تو در تو هم اطلاعات رو در حالت Post بایند کنه. اینطوری model=> model.Post.AddDate (دو تا دات داره نه یکی). خودت باید دستی این چند سطح رو مشخص کنی (در متدهای For دار).

نظرات مطالب
ASP.NET MVC #23
- گزینه‌ی «"uncheck “Verify that file exists» را هم امتحان کنید.
- این سؤال خارج از بحث است. بازگرداندن View هیچ ارتباطی به مسیریابی ندارد. فقط کافی است بنویسید:
return View("~/Views/....مسیر کامل فایل", model);
تولید URLهای خودکار بر اساس اطلاعات مسیریابی در Viewهای برنامه، توسط متدهای توکار ActionLink و امثال آن انجام می‌شود.
- تمام خطاهای مدیریت نشده‌ی برنامه‌های وب در لاگ ویندوز ثبت می‌شوند. آن‌ها را بررسی کنید. همچنین ELMAH را هم نصب کنید تا خطاها را برای بررسی بیشتر لاگ کند.
- روش‌های قدیمی را با MVC کار نکنید. صفحه‌ی اول سایت، همان صفحه‌ای است که در مسیریابی پیش فرض تعریف شده‌است. یعنی همان اکشن متد Index در کنترلر Home، به همراه View ایی که مد نظر شما است.
نظرات مطالب
روش صحیح مقایسه دو عدد اعشاری با هم
زمانیکه d1 و d2 حاصل هیچ نوع عملیات ریاضی خاصی نباشند. برای مثال اگر 0.33 را با 0.33 مقایسه کنید. اما مقایسه double)1/3 == (double)0.33333) هرچند صحیح به نظر می‌رسد اما حاصل false است چون دقت اعشار دو طرف یکی نیست. سمت چپ حداکثر دقت را دارد و سمت راست یک عدد ثابت غیر محاسباتی است. همچنین در بسیاری از محاسبات، نتیجه‌ی نهایی در یک double جای داده می‌شود؛ مانند d3 در تصاویر فوق. علت اینجا است که مطابق استاندارد IEEE 754، نوع double یک عدد binary floating-point است و علت اینکه d3 حاصل از محاسبات در اینجا دقیقا مساوی 0.01 نشده این است که تمام بیت‌های حاصل از عملیات ریاضی محاسبه‌ی آن در double ایی که در کل 64 بیتی است، جای نمی‌گیرد و نتیجه‌ی نهایی، خیلی جزئی کمتر است از 0.01 (rounding error).
اطلاعات بیشتر
نظرات مطالب
نمایش فرم‌های مودال Ajax ایی در ASP.NET MVC به کمک Twitter Bootstrap
با سلام
منظورتون رو از مطلب زیر نفهمیدم. میشه بگید چطوری میتونیم با استفاده از alert خود بوت استرپ نتیجه را از کنترلر به فرم مدال ارسال کنیم و در آنجا نمایش دهیم؟
«این مورد پیش بینی شده در این مثال. اگر به خروجی اکشن متد دقت کنید، چنین چیزی است:
1
return Json( new { success = true });
همین مورد یعنی بررسی مقدار success دریافتی، جایی که عملیات Ajax ایی ارسال اطلاعات پایان می‌یابد انجام شده:
1
2
3
4
if (result.success) {
  $( '#dialogDiv' ).modal( 'hide' );
  if (options.completeHandler)
options.completeHandler();
بنابراین تنها کاری که باید انجام بدید، قرار دادن کدهای نمایش اطلاعات نهایی در callbackهای completeHandler  ویا  errorHandler   مربوط به افزونه  $.bootstrapModalAjaxForm   است. اینجا دست شما باز است. اگر علاقمند بودید از یک alert ساده استفاده کنید» 
نظرات مطالب
EF Code First #12
- می‌شود به ازای هر سال یک Context مجزا با Entity‌های مجزا درست کرد. فایل مثالی که با دو Context کار می‌کند در نظرات همان مطلب «استفاده از چندین Context در EF 6 Code first»  پیوست شده‌است: Sample25.cs 
ولی این روش سبب خواهد شد مجبور شوید به ازای هر سال، کوئری‌های LINQ مختلفی را هم بنویسید. یعنی لایه سرویس برنامه را باید هربار بازنویسی کنید، فقط برای اینکه نمی‌خواهید ساختار بانک اطلاعاتی را به روز کنید. چرا؟
- EF با استفاده از امکانات Migration به سادگی ساختار بانک‌های اطلاعاتی را به صورت خودکار می‌تواند به روز کند. باید هم اینکار را انجام بدهید چون کوئری‌های مختلف LINQ شما نهایتا به SQL ترجمه شده و چون یک سری از فیلدها در بانک اطلاعاتی سال قبل حضور ندارند، عملا برنامه کار نخواهد کرد. یعنی قسمت عمده‌ای از برنامه شما (کل لایه سرویس) از کار می‌افتد. کامپایل شدن برنامه در این حالت مهم نیست. آیا مثلا تنها کوئری GetAll ایی که تهیه شده، بر روی تمام سال‌ها و با ساختارهای مختلف اجرا می‌شود؟ خیر.
- سپس برای کار با بانک‌های اطلاعاتی دارای یک ساختار و مربوط به سال‌های مختلف، امکان تعیین رشته اتصالی به ازای هر Context هست:
context.Database.Connection.ConnectionString = "...";
نظرات مطالب
نحوه استفاده از افزونه Firebug برای دیباگ برنامه‌های ASP.NET مبتنی بر jQuery
حداقل دو علت می‌تونه داشته باشه:
الف) تصاویر رو نمی‌تونه پیدا کنه، یا صفحه کش شده بیش از حد. قسمت «اجرای کدهای jQuery Ajax فوق، چه تغییری را در صفحه سبب می‌شوند؟» را بررسی کنید که چه آدرسی توسط کدهای جی‌کوئری در حال پردازش است.
همچنین کش شدن نتایج قبلی رو هم می‌شود غیرفعال کرد:
$.ajax({
  cache: false /* گاهی از اوقات خصوصا برای آی ایی نیاز است */
});
ب) چند وقت قبل در یکی از بحث‌های سایت دیدم که مورد زیر رعایت نشده بود و کدهای جی‌کوئری کار نمی‌کردند:
<script type="text/javascript">
        $(function () {
            // کدهای جی‌کوئری در اینجا 
        });
</script>
اجرای کدهای جی‌کوئری نیازی به DOM حاضر و آماده دارند که توسط متد document ready آن مانند کدهای فوق باید تدارک دیده شود. نیازی به این کد نخواهد بود اگر اسکریپت‌ها در آخر صفحه و پیش از بسته شدن تگ body اضافه بشن.
نظرات مطالب
نحوه استفاده از ViewModel در ASP.NET MVC
- شما هم از ViewModel استفاده کردی و هم از ViewBag با هم در یک View. از یکی بهتره استفاده کنید. ترجیح هم با ViewModel است تا به خواص آن به صورت strongly typed در یک View دسترسی داشته باشید و تحت کنترل کامپایلر هم باشد (تمام ViewBagها رو حذف و تبدیل به خواص ViewModel کنید).
- کلاس ViewModel ایی که تدارک دیدید، دارای سازنده‌ای است که باید مقدار دهی شود پیش از استفاده. خوب ... MVC از کجا باید تشخیص بده که در زمان Post اطلاعات به سرور چطور باید این‌رو به صورت خودکار وهله سازی کنه؟ به عبارتی ViewModel شما باید بدون سازنده، قابل وهله سازی باشد. سازنده رو حذف و صرفا از خواص استفاده کنید.
- برای ثبت نهایی هم باید اطلاعات خواص ViewModel رو (اون‌هایی رو که در Model یا جدول خاص شما وجود دارند) به Model انتساب بدی. بعد این وهله Add شود به Context و دست آخر هم ذخیره.
 (البته کار شما به نظر لایه بندی صحیحی نداره وگرنه جای این مسایل در لایه سرویس برنامه است؛ چه بازگشت ViewModel و چه ذخیره سازی اطلاعات آن)
نظرات مطالب
خودکار کردن تعاریف DbSetها در EF Code first
- بحث جاری در مورد EF 5 هست. کل مباحثی که در سایت مطرح شده در مورد تا قبل از EF 6 است. (هرچند هدف اصلی EF6 از بحث چند Context ایی پوشش دادن ایجاد جداول مختلف به ازای Schema‌های مختلف است. پیشتر dbo بیشتر مد نظر بود (پشتیبانی از تک schema به ازای یک دیتابیس). الان پوشش چندین Schema با هم در طی چندین Context مختلف در یک بانک اطلاعاتی)
- تاثیری نداره. نگاشت‌ها فقط یکبار در آغاز کار برنامه انجام می‌شوند و بعد کش خواهند شد. هر بار وهله سازی context به معنای انجام چند باره نگاشت‌ها و یافتن و برقراری آن‌ها نیست. اتفاقا این وهله سازی‌های ثانویه پس از آغاز برنامه، فوق العاده هم سریع هستند.
خلاصه اینکه مباحث مطرح شده در مطلب جاری فقط در آغاز برنامه اجرا می‌شوند و نه به ازای هر بار وهله سازی تک Context برنامه.
- در مورد اینکه چرا باید یک کلاس Context در برنامه داشت اینجا توضیح دادم. بحث الگوی واحد کار مهم‌ترین آن‌ها است.