نظرات مطالب
اضافه کردن قابلیت از سرگیری مجدد (resume) به HttpWebRequest
- بله. این یک استاندارد است.
- بسته به سیاست یک سایت ممکن است فایل را پس از مدتی پاک کنند. یک سری از دانلود سنترهای عمومی به همین صورت هستند.
- تمام فایل‌های youtube لینک مستقیم به فایل flv هم دارند. می‌شود به این صورت فایل‌های آن‌ها را دریافت کرد با قابلیت از سرگیری مجدد.
پاسخ به بازخورد‌های پروژه‌ها
خطای data binding
این مشکل مربوط است به Adobe reader و اکتیو ایکس آن که برای نمایش فایل‌های PDF مورد استفاده قرار گرفته. باید ارجاعات آن‌را یکبار حذف کنید و بعد مطابق تنظیمات سیستم خودتون Add کنید. در مورد جزئیات اکتیوایکس Adobe به مقاله زیر مراجعه کنید:
«نحوه نمایش فایل‌های PDF»

مطالب دوره‌ها
حذف یک ردیف از اطلاعات به همراه پویانمایی محو شدن اطلاعات آن توسط jQuery در ASP.NET MVC
فرض کنید تعدادی ردیف در گزارشی نمایش داده شده‌اند. قصد داریم برای هر ردیف یک دکمه حذف را قرار دهیم. این حذف باید Ajax ایی باشد؛ به علاوه در حین حذف ردیف، پویانمایی محو آن ردیف را نیز سبب شود.


مدل و منبع داده برنامه

namespace jQueryMvcSample06.Models
{
    public class BlogPost
    {
        public int Id { set; get; }
        public string Title { set; get; }
        public string Body { set; get; }
    }
}

using System.Collections.Generic;
using jQueryMvcSample06.Models;

namespace jQueryMvcSample06.DataSource
{
    /// <summary>
    /// منبع داده فرضی جهت سهولت دموی برنامه
    /// </summary>
    public static class BlogPostDataSource
    {
        private static IList<BlogPost> _cachedItems;
        static BlogPostDataSource()
        {
            _cachedItems = createBlogPostsInMemoryDataSource();
        }

        /// <summary>
        /// هدف صرفا تهیه یک منبع داده آزمایشی ساده تشکیل شده در حافظه است
        /// </summary>        
        private static IList<BlogPost> createBlogPostsInMemoryDataSource()
        {
            var results = new List<BlogPost>();
            for (int i = 1; i < 30; i++)
            {
                results.Add(new BlogPost { Id = i, Title = "عنوان " + i, Body = "متن ... متن ... متن " + i});
            }
            return results;
        }

        public static IList<BlogPost> LatestBlogPosts
        {
            get { return _cachedItems; }
        }
    }
}
در اینجا مدل برنامه که ساختار نمایش یک سری مطلب را تهیه می‌کند، ملاحظه می‌کنید؛ به علاوه یک منبع داده فرضی تشکیل شده در حافظه جهت سهولت دموی برنامه.


کنترلر برنامه

using System.Web.Mvc;
using System.Web.UI;
using jQueryMvcSample06.DataSource;
using jQueryMvcSample06.Security;

namespace jQueryMvcSample06.Controllers
{
    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            var postsList = BlogPostDataSource.LatestBlogPosts;
            return View(postsList);
        }

        [AjaxOnly]
        [HttpPost]
        [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
        public ActionResult DeleteRow(int? postId)
        {
            if (postId == null)
                return Content(null);

            //todo: delete post from db

            return Content("ok");
        }
    }
}
کنترلر برنامه بسیار ساده بوده و نکته خاصی ندارد. در حین اولین بار نمایش صفحه، لیست مطالب را به View مرتبط ارسال می‌کند. همچنین یک اکشن متد حذف ردیف‌های نمایش داده شده را نیز در اینجا تدارک دیده‌ایم. این اکشن متد از طریق ارسال اطلاعات به صورت Ajax، شماره مطلب را در اختیار برنامه قرار می‌دهد که توسط آن در ادامه برای مثال می‌توان این رکورد را از بانک اطلاعاتی حذف کرد. امضای متد DeleteRow بر اساس پارامترهای ارسالی توسط jQuery Ajax مشخص و تنظیم شده‌اند:
 data: JSON.stringify({ postId: postId }),

View برنامه

@model IEnumerable<jQueryMvcSample06.Models.BlogPost>
@{
    ViewBag.Title = "Index";
    var postUrl = Url.Action(actionName: "DeleteRow", controllerName: "Home");
}
<h2>
    حذف یک ردیف از اطلاعات به همراه پویانمایی محو شدن اطلاعات آن</h2>
<table>
    <tr>
        <th>
            عملیات
        </th>
        <th>
            عنوان
        </th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                <span id="row-@item.Id">حذف</span>
            </td>
            <td>
                @item.Title
            </td>
        </tr>
    }
</table>
@section JavaScript
{
    <script type="text/javascript">
        $(function () {
            $('span[id^="row"]').click(function () {
                var span = $(this);
                var postId = span.attr('id').replace('row-', '');
                var tableRow = span.parent().parent();
                $.ajax({
                    type: "POST",
                    url: '@postUrl',
                    data: JSON.stringify({ postId: postId }),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    complete: function (xhr, status) {
                        var data = xhr.responseText;
                        if (xhr.status == 403) {
                            window.location = "/login";
                        }
                        else if (status === 'error' || !data || data == "nok") {
                            alert('خطایی رخ داده است');
                        }
                        else {
                            $(tableRow).fadeTo(600, 0, function () {
                                $(tableRow).remove();
                            });
                        }
                    }
                });
            });
        });
    </script>
}
کدهای View برنامه را در ادامه ملاحظه می‌کنید. اطلاعات مطالب دریافتی به صورت یک جدول در صفحه نمایش داده شده‌اند. در هر ردیف توسط یک span که با css تزئین گردیده است، یک دکمه حذف را تدارک دیده‌ایم. برای اینکه در حین کار با jQuery بتوانیم id هر ردیف را بدست بیاوریم، این id را در قسمتی از id این span اضافه شده قرار داده‌ایم.
در کدهای اسکریپتی صفحه، ابتدا کلیک بر روی کلیه spanهایی که id آن‌ها با row شروع می‌شود را مونیتور خواهیم کرد:
 $('span[id^="row"]').click(function () {
سپس هر زمان که بر روی یکی از این spanها کلیک شد، می‌توان بر اساس span جاری، id و همچنین tableRow مرتبط را استخراج کرد:
 var span = $(this);
var postId = span.attr('id').replace('row-', '');
var tableRow = span.parent().parent();
اکنون که به این اطلاعات دسترسی پیدا کرده‌ایم، تنها کافی است آن‌ها را توسط متد ajax به کنترلر برنامه برای پردازش نهایی ارسال نمائیم. همچنین در پایان کار عملیات، توسط متدهای fadeTo و remove ایی که ملاحظه می‌کنید، سبب حذف نمایشی یک ردیف به همراه پویانمایی محو آن خواهیم شد.


دریافت کدها و پروژه کامل این قسمت
jQueryMvcSample06.zip 
بازخوردهای دوره
تزریق وابستگی‌ها
"حین استفاده از تزریق وابستگی‌ها، وهله سازی به تاخیر افتاده وابستگی‌ها میسر نیست "
فکر کنم منظورتان فقط هنگام تزریق وابستگی از طریق constructor است؟ چون چنانچه از روش تزریق setter استفاده کنیم این مشکل حل میشود. درست برداشت کرده ام؟
اشتراک‌ها
آسیب‌پذیری integer overflow در Git 2.39 و نسخه‌های قبل‌تر از آن

در نسخه 2.39 و نسخه‌های قبل‌تر از آن دو آسیب‌پذیری جدید پیدا شده است که منجر به integer overflow میشوند؛ اولی مربوط به git log --format است که حین استفاده از padding operatorها اگر آفست بزرگی پاس داده شود رخ خواهد داد. دومی هم مربوط به پارزر gitattribute است؛ که حین بارگذاری فایل از ایندکس اگر محتویات نامعتبری در آن باشد رخ خواهد داد. همچنین در Git GUI ویندوز نیز موقع clone کردن یک مخزن گیت یکسری post-processing بر روی branch دیفالتی که checkout میشود انجام خواهد شد به عنوان مثال یکی از این فازها spell-checker است؛ در حین انجام این پردازش‌ها ممکن است یک مخزنی حاوی untrusted codeهایی باشد.

جزئیات هر کدام از این آسیب‌پذیری‌ها را میتوانید در لینک مشاهده کنید؛ برای رفع این مشکل بهتر است ورژن Git خود را بروزرسانی کنید. در غیراینصورت باید حین کار با untrusted repositories از فلاگ --format و همچنین git archive استفاده نکنید. همچنین بهتر است از Git GUI برای کار با untrusted repositories استفاده نکنید.

آسیب‌پذیری integer overflow در Git 2.39 و نسخه‌های قبل‌تر از آن
اشتراک‌ها
روش غیرفعال کردن موقتی ReSharper

اگر در حین کار با nuget و صدور فرمان update-package آن، nuget مدام هنگ می‌کند، مشکل از تداخل ReSharper با آن است. از طریق منوی Tools | Options | ReSharper می‌توان ReSharper را به صورت موقت غیرفعال کرد.

روش غیرفعال کردن موقتی ReSharper
نظرات مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 13 - معرفی View Components
«....  یک نکته: اگر نام کلاسی به ViewComponent  ختم شده بود، نیازی نیست تا ViewComponent  را هم در حین ساخت پوشه‌ی آن ذکر کرد... »
ViewComponent را هم از نام کلاس و هم از نام پوشه حذف و بر این اساس مسیرها را اصلاح کنید.
نظرات مطالب
کدامیک از بسته‌های NET Core. را باید دریافت کنیم؟
- ASP.NET Core 3.0 فقط این بسته‌ها را مخفی می‌کند؛ نه اینکه استفاده نمی‌کند. اطلاعات بیشتر
نظرات مطالب
شروع به کار با EF Core 1.0 - قسمت 2 - به روز رسانی ساختار بانک اطلاعاتی
ممنون با بیلد کردن پروژه از طریق Cli خطایی برخوردم که شرح آن در اینجا هست.
احتمالا در حین ارتقا از Dotnet Core 1 به 2 این مشکل پیش آمده است.
الان فایل Migration با موفقیت ایجاد شد. سپاس