نظرات مطالب
بازنویسی ساده‌تر پیش فرض‌های EF Code first در نگارش 6 آن
من با EF6 از
modelBuilder.Types().Configure(c=>c.Ignore("IsDeleted"));
استفاده کردم ولی خطای زیر رو میگیرم:
You cannot use Ignore method on the property 'IsDeleted' on type 'MyEntity' 
because this type inherits from the type 'BaseEntity' where this property is mapped.
To exclude this property from your model, use NotMappedAttribute or Ignore method on the base type.
نظرات مطالب
T4MVC : یکی از الزامات مدیریت پروژه‌های ASP.NET MVC
من در پروژم Controller ها رو در یک لایه و View‌ها را در لایه‌ی دیگری دارم. از T4MVC هم در لایه‌ی Controller استفاده کردم. اما بعد از زدن Run Custom Tool مسیرهایی که منتهی به یک view میشه ساخته نمیشه و Error میده! (آنهایی که RedirectToAction هستند به درستی ساخته می‌شه)

VDoc.Web.Controllers.TopicController.ViewsClass' does not contain a definition for '_Edit' and no extension method '_Edit' accepting a first argument of type 'VDoc.Web.Controllers.TopicController.ViewsClass' could be found (are you missing a using directive or an assembly reference?)

آیا برای استفاده از T4 در لایه‌های مختلف باید کار خاصی انجام بدم؟
نظرات مطالب
فعال سازی قسمت ارسال فایل و تصویر ویرایشگر آنلاین RedActor در ASP.NET MVC
با سلام؛ من یک ویو دارم که در آن از دوتا redactor استفاده کردم. در واقع سناریوی من به این شکل است. یکی از این redactor برای ورود خلاصه‌ی متن است و در زیر آن یک لینک ایجکسی وجود دارد که میره و یک partial را می‌یاره. توی partial اونredactor دومی قرار دارد و جالب وقتی که من یک فایلی را در red actor که در پارشال هست آپلود می‌کنم فایل آپلود می‌شود ولی هنگامی که در صفحه‌ی سایتم می‌خوام دانلود کنم Error زیر را می‌دهد.
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
حالا باید چه کار کنم؟ ممنون
نظرات مطالب
مروری بر قابلیت جدید ASP.NET FriendlyUrls
سلام؛ من کتابخانه رو به پروژه اضافه کردم. اما برای فعال سازیش به مشکل برخوردم. EnableFriendlyUrls رو نمیشناسه و خطا میده
 System.Web.Routing.RouteCollection' does not contain a definition for 'EnableFriendlyUrls' 
and no extension method 'EnableFriendlyUrls' accepting a first argument of type 
'System.Web.Routing.RouteCollection' could be found (are you missing a using directive or an assembly reference?)
استفاده هم زمان این روش با url routing که مشکلی به وجود نمیاره؟
نظرات مطالب
مفهوم READ_COMMITTED_SNAPSHOT در EF 6
با سلام؛ در صورتی که بخواهیم این مورد را در دیتابیسی که از filestream استفاده میکنه فعال کنیم با این خطا ALTER DATABASE failed because the READ_COMMITTED_SNAPSHOT and the ALLOW_SNAPSHOT_ISOLATION options cannot be set to ON when a database has FILESTREAM filegroups.  To set READ_COMMITTED_SNAPSHOT or ALLOW_SNAPSHOT_ISOLATION to ON, you must remove the FILESTREAM filegroups from the database.
  مواجه می‌شویم من در دیتابیس از filestreame استفاده کردم برای ذخیره فایلهای مورد نیاز در نرم افزار خودم، می‌خواستم بدونم آیا استفاده از این روش (filestreame)  اصولا خوب هست یا نه؟
اشتراک‌ها
مجموعه‌ای از بانک‌های اطلاعاتی نمونه
Collection of Sample Databases

In this post, I've compiled a comprehensive collection of sample databases, conveniently categorized by provider, to make it easier for you to find the right dataset for your needs. Whether you're looking for structured data for prototyping, experimenting with new metrics, or evaluating product performance, this collection offers a variety of real-world examples.
مجموعه‌ای از بانک‌های اطلاعاتی نمونه
مطالب
آپلود فایل ها با استفاده از PlUpload در Asp.Net Mvc
امروزه بازار برنامه‌های تماما ajax و بدون Postback  شدن صفحه بسیار داغ میباشد که از این موارد میتوان به برنامه‌های تحت وب گوگل اشاره کرد. (gmail  ، googlePlus  ، Google Reader)
در این میان یکی از دغدغه‌های توسعه دهندگان وب ، آپلود فایل‌ها به صورت آنی (مثل attach files گوگل) میباشد. برای حل این مسئله ، ابزارها و پلاگین‌های متعددی وجود دارد که در اینجا به 10 تا از پلاگین‌های Jquery  اشاره شده است.
به شخصه با پلاگین Uploadify کار کرده ام و از استفاده از آن راضی هستم ولی همین دیشب برای قسمتی از یک پروژه نیاز
به ابزاری جهت آپلود فایل‌ها با امکانات مورد نظرم داشتم که به PlUpload برخورد کردم. 

از امکاناتی که این ابزار در اختیار شما قرار میدهد :
- یک اینترفیس زیبا جهت آپلود و افزودن فایل ها
- پشتیبانی از زبان‌های مختلف و همین طور زبان فارسی
- امکان استفاده از قالب Jquery UI
- Drag&Drop  برای مرورگرهایی که از Html5  پشتیبانی میکنند

حال که با امکانات این ابزار بیشتر آشنا شدید بریم سراغ استفاده از این ابزار در asp.net mvc  :)
ابتدا پروژه را از اینجا دانلود کنید. سپس یک پروژه‌ی جدید  mvc 3  بسازید (از نوع Internet Application و با نام دلخواه). سپس پوشه‌ی plupload  را در قسمت سلوشن برنامه کپی کنید.
حال در فایل Views->Shared->_Layout.cshtml  ، تگ head  را جهت افزودن امکانات پلاگین این گونه تغییر دهید :

    <title>@ViewBag.Title</title>

    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <link href="../../plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css" rel="stylesheet" />
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
    <script type="text/javascript" src="http://bp.yahooapis.com/2.4.21/browserplus-min.js"></script>

    <script src="../../plupload/js/plupload.full.js"></script>
    <script src="../../plupload/js/jquery.plupload.queue/jquery.plupload.queue.js"></script>
    <script src="../../plupload/js/i18n/fa.js"></script>

نکته : فایل fa.js  که جهت استفاده از زبان فارسی در اینترفیس آپلود فایل‌ها میباشد، که وجود آن در آدرس واضح میباشد.
سپس به فایل Views->Home->Index.cshtml بروید و آن را این گونه دوباره نویسی کنید :
 @{
    ViewBag.Title = "Uploading Files using PlUpload";
}
<h2>@ViewBag.Message</h2>

@using (Html.BeginForm("Post", "home", FormMethod.Post,
    new { enctype = "multipart/form-data" }))
{
    <div id="uploader">
        <p>You browser doesn't have Flash, Silverlight, Gears, BrowserPlus or HTML5 support.</p>
    </div>
}

<script>
    $(function () {

        $("#uploader").pluploadQueue({
            // General settings
            runtimes: 'html5,gears,flash,silverlight,browserplus,html4',
            url: '@Url.Action("Upload" , "Home")',
            max_file_size: '10mb',
            chunk_size: '1mb',
            unique_names: true,

            // Resize images on clientside if we can
            resize: { width: 320, height: 240, quality: 90 },

            // Specify what files to browse for
            filters: [
                { title: "Image files", extensions: "jpg,gif,png" },
                { title: "Zip files", extensions: "zip" }
            ],

            // Flash settings
            flash_swf_url: '/plupload/js/plupload.flash.swf',

            // Silverlight settings
            silverlight_xap_url: '/plupload/js/plupload.silverlight.xap'
        });
    });
</script>
توضیحات و نکات :
- جهت آپلود فایل‌ها تگ enctype = "multipart/form-data" را فراموش نکنید.
- در قسمت مقداردهی به ویژگی‌های Plupload  ، قسمت runtime  به صورت ترتیبی کار میکند لذا اگر اولی پشتیبانی نشود سراغ دومی میرود و اگر دومی نشود سومی و ... در صفحه‌ی اول سایت PlUpload ، موارد پشتیبانی شده توسط تکنولوژی‌ها آورده شده است لذا این ترتیب را ترتیب مناسبی میبینم و اگر اولین مورد html5 باشد امکان Drag&Drop وجود خواهد داشت.
خود سایت PlUpload  داکیومنت خیلی خوبی جهت توضیح موارد مختلف دارد لذا توضیح دوباره لازم نیست.
همان طور که در ویژگی url  مشاهده میکنید به کنترلر Home  و اکشن متود Upload اشاره شده است که طرز کار به این گونه است که هر بار که یک فایل آپلود میشود درخواستی به این آدرس و محتوای فایل در قسمت Request.Files ارسال میشود و همین طور نام فایل که unique ارسال میشود و chunk که تیکه‌های فایل است(پست میشود).
پس اکشنی با نام Upload  در کنترلر HomeController بسازید :
        [HttpPost]
        public ActionResult Upload(int? chunk, string name)
        {
            var fileUpload = Request.Files[0];
            var uploadPath = Server.MapPath("~/App_Data");
            chunk = chunk ?? 0;
            using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append))
            {
                if (fileUpload != null)
                {
                    var buffer = new byte[fileUpload.InputStream.Length];
                    fileUpload.InputStream.Read(buffer, 0, buffer.Length);
                    fs.Write(buffer, 0, buffer.Length);
                }
            }
            return Content("chunk uploaded", "text/plain");
        } 
توضیحات : ابتدا فایل مورد نظر از قسمت Request.Files واکشی میشود و سپس فایل را در پوشه App_Data ذخیره میکند. (یکی از چندین روش ذخیره سازی که مطالعه در این قسمت به خواننده واگذار میشود.)

حال برنامه را اجرا کنید و از این ابزار لذت ببرید:) 
نکته : قسمت فارسی ساز اونو تغییر دادم چون که ترجمه‌ی فارسی خودش یه سری نقایصی داشت که گویا از کار با google translate به وجود اومده بود!
مطالب
SQL Injection چیست؟
برای ایجاد امنیت در نرم افزار، باید ابتدا مشکلات رایج را بدانیم. یکی از رایجترین نقائص امنیتی نرم افزارها SQL Injection می‌باشد.
SQL Injection در لغت به معنی تزریق کد SQL می‌باشد. در اصلاح یعنی تزریق دستوراتی به کد SQL تولیدی یک نرم افزار به نحوی که به جای عمل مورد انتظار برنامه نویس آن، کاری را که ما می‌خواهیم انجام دهد. مثلا به جای اینکه هنگام ورود به برنامه وقتی کاربر مشخصات کاربری خود را وارد می‌کند، مشخصات کاربری را به نحوی وارد کنیم که بتوانیم بعنوان مدیر سامانه و یا یک کاربر معمولی بدون داشتن کلمه عبور وارد سیستم شویم.
البته همیشه از این نوع حمله برای ورود به سیستم استفاده نمی‌شود. یعنی ممکن است هکر به عنوان یک کاربر عادی وارد سیستم شود ولی با به کاربردن دستورات خاص SQL در بخش‌های مختلف، بتواند اطلاعاتی را حذف نماید.
خوب حالا این کار چگونه انجام می‌شود؟
فرض کنید برنامه نویسی کد چک نام کاربری را اینگونه نوشته باشد:
SqlCommand cmd=new SqlCommand ("select count(*) from login where user='"+userName+"' and pass='"+password+"'",con);

فکر نکنید خوب این نوع کد نویسی مربوط به زمان تیرکمون شاه است! همین امروز در نظارت از یک پروژه به این نکته برخورد کردم! دلیل نوشتن این مقاله هم همین کد بود.
خوب حالا مگر کد بالا چه مشکلی دارد؟ ;) اگر کاربر در نامه کاربری و کلمه عبور مقادیر معمولی وارد کند (مانند admin, salam123) کد sql تولید شده به شکل زیر خواهد بود:

select count(*) from login where user='admin' and pass='salam123'

خوب حالا اگر کاربر کمی با ورودی‌ها بازی کند. به عنوان مثال فرض کنید به جای کلمه عبور تایپ کند
' or 1=1 --

نتیجه حاصله خواهد بود:
select count(*) from login where user='admin' and pass='' or 1=1 --'

با وارد کردن این دستور کاربر بدون داشتن کلمه عبور خواهد توانست وارد سیستم شود. موردی که توضیح دادم پایه مسئله بود. ما قصد آموزش هک نداریم ولی داشتن اطلاعات پایه لازم است. ممکن است فردی بگوید خوب ما قبل از تولید همچین کدی ' را از رشته کلمه عبور حذف می‌کنیم. خیلی خوب ولی اگر هکر از معادل unicode آن استفاده کرد چه؟ اگر و اگر و اگر...
راه حل‌های متعددی برای این موضوع پیشنهاد شده است. ولی ساده‌ترین و کارآمد‌ترین راه، استفاده از پارامترها می‌باشد که علاوه بر حذف این خطر باعث ایجاد و ذخیره query plan در sql server می‌شود و اجرای این query را در آینده تسریع می‌کند.
بنابراین می‌توان کد فوق را به صورت زیر بازنویسی کرد:
SqlCommand cmd=new SqlCommand ("select count(*) from login where user=@u and pass=@p",con);

cmd.Parameters.Add("@u", SqlDbType.Varchar, 10).Value=TextLogin.Text.Trim();

cmd.Parameters.Add("@p", SqlDbType.Varchar,10).Value=TextPwd.Text.Trim();
مطالب
بازسازی کد: تعریف متغیر توضیحی (Introduce explaining variable)
زمانیکه عبارت شرطی، یا محاسبات پیچیده‌ای در کد وجود دارد، می‌توان آن را به بخش‌های کوچکتری تقسیم و برای هر بخش، یک متغیر توضیحی ایجاد کرد؛ به طوری‌که نام متغیر، توضیح کافی ای در مورد آن بخش از عبارت باشد. 
در ادامه‌ی این بازسازی کد، معمولا می‌توان بازسازی کد جایگزینی متغیر موقتی با پرس و جو (Replace temp with query) را انجام داد. زیرا متغیرهای محلی صرفا در محدوده‌ی متد خود قابل دسترسی هستند و ممکن است توسعه‌ی یک متد بلند را به همراه بیاورند.
به طور مثال به تکه کد زیر توجه کنید:
if (platform.ToUpper().Contains("MAC") && browser.ToUpper().Contains("SAFARI")) 
{ 
        // do something 
}
این تکه کد با بررسی زیرساخت و مرورگر کاربر، کاری را انجام می‌دهد. اما با کمی دقت متوجه می‌شویم عبارت شرطی استفاده شده در آن کمی پیچیده است. می‌توان این کد را به صورت زیر بازسازی کرد. 
var isSafari = browser.ToUpper().Contains("SAFARI"); 
var isMac = platform.ToUpper().Contains("MAC"); 
if (isSafari && isMac) 
{ 
    // do something 
}
کد حاصل از بازسازی انجام شده، کدی خواناتر و قابل توسعه‌تر است (البته در این مثال با نمونه‌ای ساده سر و کار داریم و موارد واقعی‌تر معمولا پیچیدگی بیشتری دارند).  

مراحل انجام این بازسازی کد  

  1. متغیر محلی ای را ایجاد نمایید و بخشی از عبارت پیچیده را به آن مقداردهی کنید. 
  2. تمامی استفاده‌ها از آن بخش از عبارت را با مقدار متغیر جایگزین نمایید. 
  3. کد را کامپایل و تست نمایید. 
  4. برای بخش‌های دیگر عبارت پیچیده همین کارها را تکرار نمایید. 

مثال: با متدی که محاسبه قیمت نهایی یک کالا را انجام می‌دهد، شروع می‌کنیم.  
public decimal GetPrice() { 
    // price = base price - quantity * discount + shipping 
    return quantity * itemPrice - Math.Max(0, quantity - 500) * itemPrice * 0.05 
        + Math.Min(quantity * itemPrice * 0.1, 100); 
}
در اولین نگاه متوجه می‌شویم که می‌توان بخشی از محاسبات را که مربوط به قیمت پایه است، به صورت جداگانه در متغیری ذخیره نماییم:  
var basePrice = quantity * itemPrice;
با این تغییر، متد مورد نظر به شکل زیر خواهد شد:  
public decimal GetPrice() { 
    // price = base price - quantity * discount + shipping 
    var basePrice = quantity * itemPrice; 
    return basePrice - Math.Max(0, quantity - 500) * itemPrice * 0.05 
        + Math.Min(basePrice * 0.1, 100); 
}
سپس با کمی دقت می‌توانیم به فرمول مستقل محاسبه تخفیف برسیم و آن را در متغیری جداگانه ذخیره نماییم. با این کار متد مورد نظر به صورت زیر خواهد شد:  
public decimal GetPrice() { 
    // price = base price - quantity * discount + shipping 
    var basePrice = quantity * itemPrice; 
    var discount = Math.Max(0, quantity - 500) * itemPrice * 0.05; 
    return basePrice - discount 
        + Math.Min(basePrice * 0.1, 100); 
}
و پس از آن نیز فرمول مربوط به محاسبه مبلغ ارسال نیز کاملا واضح خواهد بود.  
public decimal GetPrice() { 
    // price = base price - quantity * discount + shipping 
    var basePrice = quantity * itemPrice; 
    var discount = Math.Max(0, quantity - 500) * itemPrice * 0.05; 
    var shipping = Math.Min(basePrice * 0.1, 100); 
    return basePrice – discount  + shipping; 
}

مشاهده می‌کنید که نمونه کد مطرح شده، به کدی منظم‌تر و خواناتر تبدیل شده است. یکی از مزایای جانبی چنین بازسازی کدی، نیاز کمتر به کامنت‌های توضیحی در مورد بدنه متد است. به طور مثال کامنت اولین خط از متد ذکر شده، در تکه کد نهایی بازسازی شده، کامنتی بی معنی است زیرا کد، به خودی خود کاری را که انجام می‌دهد، توضیح داده‌است. به این روش کد نویسی به طور کلی self documenting code گفته می‌شود. 
همان طور که در ابتدای مطلب نیز ذکر شد، در ادامه‌ی این بازسازی کد می‌توان بازسازی‌های دیگری مانند جایگزینی متغیر موقتی با پرس و جو را نیز استفاده نمود. این مورد به عنوان تمرین به خواننده واگذار می‌شود.  
مطالب
مروری بر کاربردهای Action و Func - قسمت سوم
در ادامه مثال سوم قسمت قبل، در مورد حذف کدهای تکراری توسط Action و Func، در این قسمت به یک مثال نسبتا پرکاربرد دیگر آن جهت ساده سازی try/catch/finally اشاره خواهد شد.
احتمالا هزاران بار در کدهای خود چنین قطعه کدی را تکرار کرده‌اید:
try {
       // code
} catch(Exception ex) {
       // do something
}
این مورد را نیز می‌توان توسط Actionها کپسوله کرد و پیاده سازی قسمت بدنه try آن‌را به فراخوان واگذار نمود:
void Execute(Action action) {
    try {
       action();
    } catch(Exception ex) {
       // log errors
    }
}
و برای نمونه جهت استفاده از آن خواهیم داشت:
Execute(() => {open a file});

یا اگر عمل انجام شده باید خروجی خاصی را بازگرداند (برخلاف یک Action که خروجی از آن انتظار نمی‌رود)، می‌توان طراحی متد Execute را با Func انجام داد:
public static class SafeExecutor
{
    public static T Execute<T>(Func<T> operation)
    {
        try
        {
            return operation();
        }
        catch (Exception ex)
        {
            // Log Exception
        }
        return default(T);
    }
}
در این حالت فراخوانی متد Execute به نحو زیر خواهد بود:
var data = SafeExecutor.Execute<string>(() =>
{
    // do something
    return "result";
});
و اگر در این بین استثنایی رخ دهد، علاوه بر ثبت جزئیات خطای رخ داده شده، نال را بازگشت خواهد داد.

از همین دست می‌توان به کپسوله سازی منطق «سعی مجدد» در انجام کاری اشاره کرد:
public static class RetryHelper
{
   public static void RetryOperation(Action action, int numRetries, int retryTimeout)
   {
       if( action == null )
           throw new ArgumentNullException("action");

       do
       {
          try {  action(); return;  }
          catch
          { 
              if( numRetries <= 0 ) throw;
              else 
                 Thread.Sleep( retryTimeout );
           }
       } while( numRetries-- > 0 );
   }
}
برای مثال فرض کنید برنامه قرار است اطلاعاتی را از وب دریافت کند. ممکن است در سعی اول آن، خطای اتصال یا در دسترس نبودن لحظه‌ای سایت رخ دهد. در اینجا نیاز خواهد بود تا این عملیات چندین بار تکرار شود؛ که نمونه‌ای از آن‌را در ذیل ملاحظه می‌کنید:
RetryHelper.RetryOperation(() => SomeFunction(), 3, 1000);