# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET MVC > حرفه ای: آموزش 0 تا 100 برنامه نویسی MVC

## fatima_h66

با سلام به دوستان
تو این تاپیک قصد آموزش MVC به شیوه خودمو دارم
امیدوارم همراهیم کنید و دلگرمی بهم بدید. نکات کاربردی جدید تو زمینه این تاپیک داشتید در اختیار بچه ها قرار بدید
با تشکر

----------


## fatima_h66

معماری MVC در دهه 70 میلادی معرفی شد اما در آن زمان پیاده سازی برنامه های Stand Alone با استفاده از این معماری چندان مورد استقبال برنامه نویسان قرار نگرفت. اما با ظهور اینترنت و برنامه های مبتنی بر وب این معماری شانس دوباره ای یافت. ASP.NET MVC فریم ورک مبتنی بر معماری MVC مایکروسافت میباشد که در این سری مقالات به معرفی و بررسی آن خواهیم پرداخت. از دلایل محبوبیت این معماری نظام بخشیدن به پروژه های طراحی سایت میباشد. معمولاً به علت همکاری چندین تکنولوژی مختلف با هم در برنامه های مبتنی بر وب ساختار پروژه های بزرگ پیچیده میشوند و اعمال تغییرات و همچنین رفع خطا های پروژه مشکل و زمانبر میشوند که معماری MVC با جداسازی لایه های مختلف برنامه نویسی تا حد زیادی این مشکل را رفع کرده است. از دیگر مزایای این فریم ورک میتوان به کنترل کامل بر روی HTML نهایی، پشتیبانی از فریم ورکهای گوناگون برای Unit Testing ، کنترل بر روی آدرسهای URL و تعامل راحت تر با فریم ورکهای javascript اشاره کرد.

منبع سایت : http://psi-co.net/*MVC چیست؟*نام MVC از Model-View-Controller گرفته شده و هدف اصلی آن جدا سازی اجزای تشکیل دهنده برنامه است.بخصوص برنامه هایی که دارای واسط کاربری گرافیکی هستند (GUI-Graphical User Interface) این الگوی طراحی در سایر فریم ورک ها مثل Ruby on Rails و Django و Zend هم بکار برده شده است.Mدر MVC معادل Model است و حاوی اطلاعاتی است که نهایتا در اختیار کاربر قرار خواهد گرفت. مثلا اگر فرض کنیم اطلاعات یک شخص را میخواهیم به کاربر نشان دهیم، کلاس مدل ما شامل property های زیر خواهد بود: نام، آدرس، ایمیل و تلفنV در MVC معادل View است. و حاوی نتیجه ای است که کاربر نهایتا در بروزر خواهد دید. view در واقع userinterface برنامه ماست.C در MVC معادل Controller است. کنترلر رابط بین model وview است. کنترلر 3 مسئولیت اصلی دارد:
پردازش درخواست های ورودیانجام عملیات بر روی مدل(Domain Model)انتخاب view ای که باید در پاسخ به درخواست رندر شود
هر کنترلر شامل چندین متد public است که هر متد یک action ارائه میدهد که قرار است کنترلر بر روی مدل اجرا کند. هر action method در کنترلر با یک URL مرتبط است. وقتی کنترلر درخواستی برای آن URL خاص دریافت میکند، Action متناسب با آن را اجرا کرده و view انتخابی را رندر کرده و به بروزر برمیگرداند.شکل زیر رابطه بین اجزای MVC را بخوبی نشان میدهد:حال با ایجاد یک پروژه آشنای Hello World با ساختار Controller و view آشنا میشویم:برای ایجاد پروژه جدید مطابق معمول از منوی File ویژال استودیو ، گزینه New و سپس Project را انتخاب کنید و سپس قالب زیر را انتخاب کنید :میتوانید basic را انتخاب کنید ، اما basic شامل یک سری الگوهای آماده ، مثل Membership دات نت فریم ورک ، مراجع Jquery ، کلاسهای CSS از پیش ساخته شده استهمانطور که می بینید پوشه های مجزایی برای هر دسته از فایلها وجود دارد : مثل Controller , View , Model , ... پوشه Script شامل فایلهای جاوا اسکریپت و Jquery و MicrosoftAjax است . پوشه Conetnt هم محلی برای نگهداری فایلهای CSS و تصاویر است. پوشه App_Data جایی است که فایل‌هایی با قابلیت read/write در آن قرار می‌گیرندمطابق شکل زیر اولین کنترلر خود را به پروژه اضافه کنید: نام کلاس کنترلر مطابق قرارداد، مختوم به کلمه Controller استبرای اکشن یک View ایجاد می کنید و در آن ، مشخص می کنید که کاربر چه خروجی را باید مشاهده کند برای این کار روی اکشن راست کلیک کنید:خواهید دید که فایلی به نام Index.cshtml در فولدر View ایجاد می شود . به ازای هر Controller یک فولدر وجود دارد که در آن View های مربوطه نگهداری می شونداین فایل را باز کنید و محتویات زیر را به آن اضافه کنید:با فشردن دکمه F5 اولین صفحه وب خود را که با تکنولوژی MVC ساخته اید ببینید.خب تا اینجای کار یک پروژه جدید MVC ایجاد کردیم ، کمی در مورد ساختار MVC صحبت کردیم در مقالات بعدی بیشتر به بررسی امکانات این معماری زیبا خواهیم پرداخت.

----------


## fatima_h66

در این مقاله به بخش اصلی کنترلر mvc که همان action method ها هستند خواهیم پرداخت. به کمک همین action method هاست که میتوانیم به Request ها پاسخ دهیم. در ادامه با انواع مختلف خروجی یک action method آشنا خواهیم شد .در مقاله قبلی خواندیم که هر کنترلر شامل چندین متد public است که هر متد یک action ارائه میدهد که قرار است کنترلر بر روی مدل اجرا کند. این متد ها به اکشن متد معروف هستند. هر action method در کنترلر با یک URL مرتبط است. وقتی کنترلر ،درخواستی برای آن URL خاص دریافت میکند، Action متناسب با آن را اجرا کرده و view انتخابی را رندر کرده و به بروزر برمیگرداند.ساده ترین مقدار برگشتی یک اکشن متد میتواند یک string ساده باشد. بعنوان مثال میتوانیم متد Time() زیر را به مثال خود اضافه کنیم:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
4
5
6
public ActionResult Index() {
    return View();
}
public string Time() {
    return string.Format("The time is: {0}", DateTime.Now.ToShortTimeString());
}




برگشت این string از اکشن متد به mvc اعلام میکند که گام بعدی فقط فرستادن این string به بروزر است بدون اضافه کردن هیچ تگ Html اضافی.حال برنامه را اجرا کنید و بعد از شماره پورت تایپ کنید : /Home/Time یعنی چیزی شبیه این http://localhost:60258/Home/Timeپرواضح است که برگرداندن یک string ساده ، چندان کاربردی نیست. قدرت واقعی mvc در خروجی Action Result object های آن است. همان Object ای که در مثال اول این مقاله از آن استفاده کردیم:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public ActionResult Index() {
return View();
}




متد view() که ما در این اکشن متد استفاده کردیم ، به mvc اعلام میکند که باید یک view را رندر کند. متد View یک ViewResult Object برمیگرداند ک در واقع از همان ActionResult مشتق شده است. یعنی اگر ما به جای تابع Index قبلی از تابع زیر استفاده کنیم، تفاوتی در نتیجه خروجی نخواهیم داشت:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public ViewResult Index() {
 return View();
}




مهم ترین فعالیت یک اکشن متد این است که view را رندر و Html مورد نظر را تولید کند. همانطور که اشاره شد متد View() بهترین روش برای رندر کردن View است. این متد چندین overload دارد، ساده ترین آن بدون پارامتر است.البته ما میتوانیم نام view ای که قرار است رندر شود هم به عنوان پارامتر به متد View بدهیم:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public ViewResult Index() {
    return View("MyView");
}




یا به view ای که قرار است رندر شود، داده بفرستیم: برای تست این عملکرد بهتر است ابتدا داده خود را از طریق کلاس model فراهم کنیم: در پوشه مدل خود کلاس زیر را اضافه کنید:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
4
5
6
7
8
namespace Psi_co.net.Models
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}




حال میتوان یک نمونه از این object را در متد Index ایجاد کرده و سپس به view متناظر با آن ارسال می‌کنیم[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using Psi_co.net.Models;

namespace Psi_co.net.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ViewResult Index()
        {
            var student = new Person
            {
                firstName = "A.",
                family = "Naseri"
            };

            return View(student);
    }




در موارد خاص میتوان علاوه بر data موردنظر ، اسم view ای که قرار است رندر شود هم به عنوان پارامتر ارسال کنیم:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public ViewResult Index() {
    return View("MyView", student);
}




*Redirection*استفاده دیگری که از کلاس actionResult برای ارائه خروجی استفاده میشود ، در زمینه Redirection است.برای redirect به متد دیگری در کنترلر مشابه از متد زیر استفاده میکنیم:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public RedirectToRouteResult Redirect() {
    return RedirectToAction("Time");
}




یا برای رفتن به متد دیگر در کنترلر دیگر خواهیم نوشت:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public RedirectToRouteResult Redirect() {
    return RedirectToAction("MyAction", "MyOtherController");
}




برای redirect به یک literal URL خواهیم نوشت:[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public RedirectResult RedirectLiteral() {
    return Redirect("http://www.psi-co.net");
}




برای ارسال error به بروزر[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
public HttpStatusCodeResult StatusCode() {
    return HttpNotFound();
}




[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
4
public HttpStatusCodeResult Status() 
{
return new HttpStatusCodeResult(501, "Server Error");
}




[COLOR=#FFFFFF !important]?[/COLOR]
1
2
3
4
public HttpUnauthorizedResult Status() 
{
    return new HttpUnauthorizedResult("log in first,please");
}

----------


## fatima_h66

اینجا میخام مباحت بالاتر ا زمقدماتی از متوسط تا حرفه ای رو باهم بررسی کنیم
نظرم عوض شد!
کپی کردن مطالب و قرار دادنش زیاد بنظرم جالب نیست
بذارید وقتمون رو صرف مطالب حرفه ای کنیم

----------


## fatima_h66

*سرفصلهای دوره:*
*Overview of ASP.NET MVC*
Model-View-Controller Pattern ExplainedASP.NET MVC Platform ArchitectureAdvantages/Disadvantages of MVCAdvantages/Disadvantages of WebFormsUsing WebForms and MVC together
Sharing DataUsing Web Form Controls in MVC ViewsLinking to MVC Actions from Web Forms*ASP.NET MVC Application Components*
The ModelThe ViewThe ControllerUnderstanding the MVC Execution ProcessDeveloping FormsUsing HTML Helper FunctionsValidating User Input*Developing Models*
Creating Model Classes using ADO.NETCreating Model Classes using LINQADO.NET Entity Framework 4.1Using MvcScaffolding*Developing Views*
Working with ViewsUsing the Razor-View Engine to Create Dynamic Web PagesStrongly-Typed ViewsRendering Elements with Helper ObjectsAdding ValidationHTML5 Project Templates*Developing Controllers*
Defining Action MethodsActionResult Types
ViewResultRedirectResultJsonResultIController InterfaceDesigning a Controller ClassActionFilters*Routing Control*
Routing in ASP.NET MVCDefining URL RoutesRegistering RoutesCreating URLs from RoutesAdding Constraints to RoutesDebugging Techniques*Developing ASP.NET MVC Applications*
Installing Necessary ComponentsUsing Action MethodsUsing Different View EnginesActionResult and ViewResult ClassesRendering a ViewUsing Embedded ScriptsStrongly-Typed Views*MVC Unit Testing*
Test-Driven Development
Test Cases and ClassesUsing NUnitDependency InjectionCreating Unit TestsTesting and Mocking Frameworks for ASP.NET MVC Applications*Securing MVC Applications*
Defending against Attacks
Cross-site ScriptingSession HijackingSQL InjectionInput ForgeryUsing Attributes to Secure an Application

----------


## fatima_h66

*معرفی ASP.NET Identity*در سال 2005 مایکروسافت ASP.NET Membership را معرفی کرد تا نیازهایی که تمامی برنامه نویسان برای احراز هویت و تعیین سطوح دسترسی کاربران داشتند را برطرف نماید.
در ابتدا سیستم ASP.NET Membership بسیاری از نیازهای برنامه نویسان را برطرف می نمود از جمله: ثبت نام، فراموشی کلمه عبور و تعیین گروه کاربر (هر کاربر می توانست در گروهایی همچون، Admin و سایر گروه هایی که شما تعریف می کردید قرار بگیرد) و... در نهایت این سیستم بسیار کمک بزرگی به برنامه نویسان کرد.
اما با گذشت زمان و تغییر و افزایش نیاز برنامه نویسان، سیستم ASP.NET Membership مشخص شد که دیگر پاسخگوی نیاز برنامه نویسان نیست بنابراین مایکروسافت سیستم جدیدی را با نام ASP.NET Identity را معرفی کرد که بسیار قدرتمندتر از سیستم ASP.NET Membership بود و همچنین امکانات جدیدی به آن اضافه شده بود ازجمله احراز هویت بر اساس سرویس های سایر سایتها و شبکه های اجتماعی مانند facebook, Google,.. و احراز هویت بر اساس سیستم های ارسال پیامک و امکانات دیگر که هر یک به نوبه خود جدید و بسیار مفید خواهند بود.

*معرفی مفاهیم احراز هویت*در سیستم های احراز هویت دو مبحث اصلی وجود دارد
1-      Authentication
Authentication برای تعیین هویت کاربر به کار می رود به عبارت ساده " Authentication وظیفه دارد تعیین کند شما چه کسی هستید؟". خوب مشخص است برای تعیین هویت باید شما نام کاربری و کلمه عبور خود را وارد نمایید.
2-      Authorization
پس از آنکه تعیین شد شما چه کسی هستید باید مشخص شود شما چه کارهایی می توانید انجام دهید.
هر یک از این مفاهیم مکمل دیگری هستند و بخشی از سیستم احراز هویت را کنترل می کنند.
طبیعتا یک بار در بخش ورود به سیستم، مشخص می شود که شما چه کسی هستید اما در بخش های مختلف سایت باید مشخص شود شما آیا اجازه دارید کاری را انجام دهید یا خیر.

*ایجاد یک پروژه با ASP.NET Identity*برای شروع کار با ASP.NET Identity شما می بایست یک پروژه با NET 4.5. ایجاد کنید (ASP.NET Identity فقط از NET 4.5. به بالا پشتیبانی می کند).
برای شروع کار یک پروژه به روش زیر در Visual Studio   ایجاد نمایید.



حال دستور زیر را در package manager console بنویسید، تا یک پروژه نمونه برای کار با ASP.NET Identity نصب شود
PM>Install-PackageMicrosoft.AspNet.Identity.Samples-Preحال شما می توانید در این پروژه نمونه از روش کار ASP.NET Identity اطلاع پیدا کنید.


برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

خطای زیر را مشاهده کنید:
*An exception of type 'System.Web.Security.MembershipCreateUserException  ' occurred in System.Web.dll but was not handled in user code

Additional information: The password supplied is invalid.  Passwords must conform to the password strength requirements configured for the default provider.*این خطا در خط زیر
Membership.CreateUser(dbAccount.UserName, dbAccount.Password);از تابع
publicboolAuthorize()
{
......ارسال شده است.
*membership*به دلیل اینکه شما در وب کانفیگ خود برای membership حداقل کلمه عبور را 6 کاراکتر ست کرده اید و کلمه عبور جاری که در اسکیوال شما وجود دارد کمتر از 6 کارکتر است این خطا رخ می دهد.
باید در Web.config خود درقسمت تنظیمان membership کد  "minRequiredPasswordLength="6 را در صورتی که می خواهید حداقل طول کلمه عبور تغییر کند، تغییر دهید:
<profiledefaultProvider="DefaultProfileProvider">
<providers>
<addname="DefaultProfileProvider"type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"applicationName="/"/>
</providers>
</profile>
<membershipdefaultProvider="DefaultMembershipProvider">
<providers>
<addname="DefaultMembershipProvider"type="System.Web.Providers.DefaultMembershipProvide  r, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"enablePasswordRetrieval="false"enablePasswordReset="true"requiresQuestionAndAnswer="false"requiresUniqueEmail="false"maxInvalidPasswordAttempts="5"*minRequiredPasswordLength="6"*minRequiredNonalphanumericCharacters="0"passwordAttemptWindow="10"applicationName="/"/>
</providers>
</membership>
<roleManagerdefaultProvider="DefaultRoleProvider">
<providers>
<addname="DefaultRoleProvider"type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"applicationName="/"/>
</providers>
</roleManager>یا می توانید برای حل مشکل در مدل خود حداقل طول کلمه عبور را مطابق membership ایجاد نمایید تا مشکلی پیش نیاید
[Display(Name="کلمه عبور")]
[Required(ErrorMessage="رمز عبور را وارد نمائید")]
[MinLength(6,ErrorMessage="حداقل طول کلمه عبور 6 حرف می باشد")]
[MaxLength(50,ErrorMessage="رمز عبور مجاز نمی باشد")]
[DataType(DataType.Password)]
publicstringPassword


برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

*معرفی ASP.NET Identity*در سال 2005 مایکروسافت ASP.NET Membership را معرفی کرد تا نیازهایی که تمامی برنامه نویسان برای احراز هویت و تعیین سطوح دسترسی کاربران داشتند را برطرف نماید.
در ابتدا سیستم ASP.NET Membership بسیاری از نیازهای برنامه نویسان را برطرف می نمود از جمله: ثبت نام، فراموشی کلمه عبور و تعیین گروه کاربر (هر کاربر می توانست در گروهایی همچون، Admin و سایر گروه هایی که شما تعریف می کردید قرار بگیرد) و... در نهایت این سیستم بسیار کمک بزرگی به برنامه نویسان کرد.
اما با گذشت زمان و تغییر و افزایش نیاز برنامه نویسان، سیستم ASP.NET Membership مشخص شد که دیگر پاسخگوی نیاز برنامه نویسان نیست بنابراین مایکروسافت سیستم جدیدی را با نام ASP.NET Identity را معرفی کرد که بسیار قدرتمندتر از سیستم ASP.NET Membership بود و همچنین امکانات جدیدی به آن اضافه شده بود ازجمله احراز هویت بر اساس سرویس های سایر سایتها و شبکه های اجتماعی مانند facebook, Google,.. و احراز هویت بر اساس سیستم های ارسال پیامک و امکانات دیگر که هر یک به نوبه خود جدید و بسیار مفید خواهند بود.

*معرفی مفاهیم احراز هویت*در سیستم های احراز هویت دو مبحث اصلی وجود دارد
1-      Authentication
Authentication برای تعیین هویت کاربر به کار می رود به عبارت ساده " Authentication وظیفه دارد تعیین کند شما چه کسی هستید؟". خوب مشخص است برای تعیین هویت باید شما نام کاربری و کلمه عبور خود را وارد نمایید.
2-      Authorization
پس از آنکه تعیین شد شما چه کسی هستید باید مشخص شود شما چه کارهایی می توانید انجام دهید.
هر یک از این مفاهیم مکمل دیگری هستند و بخشی از سیستم احراز هویت را کنترل می کنند.
طبیعتا یک بار در بخش ورود به سیستم، مشخص می شود که شما چه کسی هستید اما در بخش های مختلف سایت باید مشخص شود شما آیا اجازه دارید کاری را انجام دهید یا خیر.

*ایجاد یک پروژه با ASP.NET Identity*برای شروع کار با ASP.NET Identity شما می بایست یک پروژه با NET 4.5. ایجاد کنید (ASP.NET Identity فقط از NET 4.5. به بالا پشتیبانی می کند).
برای شروع کار یک پروژه به روش زیر در Visual Studio   ایجاد نمایید.



حال دستور زیر را در package manager console بنویسید، تا یک پروژه نمونه برای کار با ASP.NET Identity نصب شود
PM>Install-PackageMicrosoft.AspNet.Identity.Samples-Preحال شما می توانید در این پروژه نمونه از روش کار ASP.NET Identity اطلاع پیدا کنید.


برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

خطای زیر را مشاهده کنید:
*An exception of type 'System.Web.Security.MembershipCreateUserException  ' occurred in System.Web.dll but was not handled in user code

Additional information: The password supplied is invalid.  Passwords must conform to the password strength requirements configured for the default provider.*این خطا در خط زیر
Membership.CreateUser(dbAccount.UserName, dbAccount.Password);از تابع
publicboolAuthorize()
{
......ارسال شده است.
*membership*به دلیل اینکه شما در وب کانفیگ خود برای membership حداقل کلمه عبور را 6 کاراکتر ست کرده اید و کلمه عبور جاری که در اسکیوال شما وجود دارد کمتر از 6 کارکتر است این خطا رخ می دهد.
باید در Web.config خود درقسمت تنظیمان membership کد  "minRequiredPasswordLength="6 را در صورتی که می خواهید حداقل طول کلمه عبور تغییر کند، تغییر دهید:
<profiledefaultProvider="DefaultProfileProvider">
<providers>
<addname="DefaultProfileProvider"type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"applicationName="/"/>
</providers>
</profile>
<membershipdefaultProvider="DefaultMembershipProvider">
<providers>
<addname="DefaultMembershipProvider"type="System.Web.Providers.DefaultMembershipProvide  r, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"enablePasswordRetrieval="false"enablePasswordReset="true"requiresQuestionAndAnswer="false"requiresUniqueEmail="false"maxInvalidPasswordAttempts="5"*minRequiredPasswordLength="6"*minRequiredNonalphanumericCharacters="0"passwordAttemptWindow="10"applicationName="/"/>
</providers>
</membership>
<roleManagerdefaultProvider="DefaultRoleProvider">
<providers>
<addname="DefaultRoleProvider"type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName="Context"applicationName="/"/>
</providers>
</roleManager>یا می توانید برای حل مشکل در مدل خود حداقل طول کلمه عبور را مطابق membership ایجاد نمایید تا مشکلی پیش نیاید
[Display(Name="کلمه عبور")]
[Required(ErrorMessage="رمز عبور را وارد نمائید")]
[MinLength(6,ErrorMessage="حداقل طول کلمه عبور 6 حرف می باشد")]
[MaxLength(50,ErrorMessage="رمز عبور مجاز نمی باشد")]
[DataType(DataType.Password)]
publicstringPassword


برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

در نهایت آموزش فایل ورد آموزش هم قرار میدم تا از این آشفتگی در بیاد آموزش ها.

----------


## fatima_h66

در نهایت آموزش فایل ورد آموزش هم قرار میدم تا از این آشفتگی در بیاد آموزش ها.

----------


## fatima_h66

کل کد پروژه را نیز برای شما قرار دادم تا بتوانید بهتر پروژه را بررسی کنید.
آموزش Asp.net Identity
password: www.eduonline.ir

----------


## fatima_h66

*افزایش سرعت Insert کردن رکورد ها در MVC*سه شنبه, ۲۴ تیر ۱۳۹۳، ۰۴:۱۷ ب.ظ

بسم الله الرحمن الرحیم


در این آموزش می خواهیم با روش جدید Insert کردن رکوردهایی با تعداد بالا به وسیله MVC آشنا کنیم و همچنین نحوه افزایش سرعت Insert کردن را فرا بگیریم.
*EntityFramework.BulkInsert*یک extension برای Entity framework 4 به بالا است که سرعت Insert کردن شما در insert های عظیم تا 20 برابر افزایش می دهد.
این extension از روش Code First و Database First پشتیبانی می کند.

برای نصب این افزونه کافی است در Package Manager Console دستورات زیر را اجرا کنید 
*Nuget**نسخه EF4*PM>Install-PackageEntityFramework.BulkInsert-ef4https://www.nuget.org/packages/Entit...BulkInsert-ef4*نسخه EF5*PM>Install-PackageEntityFramework.BulkInsert-ef5https://www.nuget.org/packages/Entit...BulkInsert-ef5*نسخه EF6*PM>Install-PackageEntityFramework.BulkInsert-ef6https://www.nuget.org/packages/Entit...BulkInsert-ef6*پشتیبانی**تمامی نسخه های Entity Framework  موجود در nuget**Code-First**Database-First (از نسخه Entity Framework 6.0.0)**Table-Per-Hirerachy**Table-Per-Type*
*روش استفاده*برای استفاده از این افزونه باید آن را در کلاس خود using کنید
usingEntityFramework.BulkInsert.Extensions;قسمت پیچیده کار برای درج اطلاعات :)
context.BulkInsert(entities);

دستور زیر بلافاصله پس از فراخوانی درون transaction خود اجرا می شود. برای ترکیب کردن Bulk و DbContext باید از TransactionScope استفاده کنید.
using(var ctx =GetContext())
{
using(var transactionScope =newTransactionScope())
{
// some stuff in dbcontext

    ctx.BulkInsert(entities);

    ctx.SaveChanges();
    transactionScope.Complete();
}
}




برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

*بسم الله الرحمن الرحیم*می خواهیم به تمامی لیست هایی که از نوع double ایجاد می شوند یک متد برای پیدا کردن عنصر میانی آنها بنویسیم

publicstaticclassLINQExtension
{
publicstaticdoubleMedian(thisIEnumerable<double> source)
{
if(source.Count()==0)
{
thrownewInvalidOperationException("Cannot compute median for an empty set.");
}

var sortedList =from number in source
orderby number
select number;

int itemIndex =(int)sortedList.Count()/2;

if(sortedList.Count()%2==0)
{
// Even number of items. 
return(sortedList.ElementAt(itemIndex)+ sortedList.ElementAt(itemIndex -1))/2;
}
else
{
// Odd number of items. 
return sortedList.ElementAt(itemIndex);
}
}
} 
برای استفاده از این متد کافی است که یک لیست از double ایجاد کنیم و به صورت زیر تابع خود را صدا بزنیم:


double[] numbers1 ={1.9,2,8,4,5.7,6,7.2,0};

var query1 = numbers1.Median();

Console.WriteLine("double: Median = "+ query1);



...


/*
 This code produces the following output:

 Double: Median = 4.85
*/ 
حال می توانیم این متد را برای نوع های دیگری چون int نیز بازنویسی کنیم:

//int overload 

publicstaticdoubleMedian(thisIEnumerable<int> source)
{
return(from num in source select(double)num).Median();
} 
حال می توانیم متد خود را برای نوع های int و double استفاده کنیم

double[] numbers1 ={1.9,2,8,4,5.7,6,7.2,0};

var query1 = numbers1.Median();

Console.WriteLine("double: Median = "+ query1);



...


int[] numbers2 ={1,2,3,4,5};

var query2 = numbers2.Median();

Console.WriteLine("int: Median = "+ query2);



...


/*
 This code produces the following output:

 Double: Median = 4.85
 Integer: Median = 3
*/ 

شما همچنین می توانید برای نوع های Generic این متد را overload کنید. این Overload یک Delegate به عنوان پارارمتر ایجاد می کند و تا بخ وسیله آن یک مجموعه یا لیست Generic را به یک نوع مشخص تبدیل کند.
متد زیر نشان می دهد که ما چطور یک Func<T, TResult> را به عنوان پارامتر ایجاد کرده ایم، این Delegate یک شی از  نوع Generic T ایجاد می کند و یک نوع double بر می گرداند.

// Generic overload. 

publicstaticdoubleMedian<T>(thisIEnumerable<T> numbers,
Func<T,double> selector)
{
return(from num in numbers select selector(num)).Median();
} 
در این مثال شما متوجه شدید که چطور می توانیم یک متد LINQ بنویسیم تا در تمامی نوع هایی که کاربر از آن شی ایی ایجاد می کند، متد خود را استفاده کنیم.
نحوه استفاده از متد:

int[] numbers3 ={1,2,3,4,5};

/* 
  You can use the num=>num lambda expression as a parameter for the Median method 
  so that the compiler will implicitly convert its value to double.
  If there is no implicit conversion, the compiler will display an error message.          
*/

var query3 = numbers3.Median(num => num);

Console.WriteLine("int: Median = "+ query3);

string[] numbers4 ={"one","two","three","four","five"};

// With the generic overload, you can also use numeric properties of objects. 

var query4 = numbers4.Median(str => str.Length);

Console.WriteLine("String: Median = "+ query4);

/*
 This code produces the following output:

 Integer: Median = 3
 String: Median = 4
*/ 

اگر بخواهیم برای متد خود یک مجموعه یا لیست را به عنوان خروجی متد تعیین کنیم، می بایست به صورت زیر متد خود را با استفاده از اینترفیس IEnumerable<T> ایجاد کنیم
// Extension method for the IEnumerable<T> interface.  
// The method returns every other element of a sequence. 

publicstaticIEnumerable<T>AlternateElements<T>(thisIEnumerable<T> source)
{
List<T> list =newList<T>();

int i =0;

foreach(var element in source)
{
if(i %2==0)
{
            list.Add(element);
}

        i++;
}

return list;
} 
فراخوانی متد
string[] strings ={"a","b","c","d","e"};

var query = strings.AlternateElements();

foreach(var element in query)
{
Console.WriteLine(element);
}
/*
 This code produces the following output:

 a
 c
 e
*/


 ۰  ۰۹۳/۰۴/۲۴۱۴۶ نمایش


اسماعیل شیدایی


*اضافه کردن متد به LINQ*



برگرفته شده از EduOnline.Blog.ir

----------


## fatima_h66

می خواهیم یک Extesion Method مانند متدهای Linq برای Model ایی خاص بنویسیم.دو نکته را برای نوشتم متدهای توسعه (Extension Method) باید رعایت کنید:1- متد را باید در کلاسی بنویسید که از نوع static باشد2- namespace شما باید با namespace کلاسی که می خواهید برای آن Extension Method بنویسید یکسان باشدما می خواهیم وقتی از شی DbContext مدل Active  را انتخاب می کنیم مانند متد ()FirstOrDefault لینک (LINQ) یک متد برای اجرای یک دستور خاص نمایش داده شود:
publicstaticclassExtensions
{
publicIQueryable<T>Active<T>(thisIQueryable<T> source)
where T :YourEntityType
{
return source.Where(a =>((a.publishEnd >DateTime.Now)||(a.publishEnd ==null))
&&((a.publishStart <=DateTime.Now)||(a.publishStart ==null))
&& a.active ==true);
}
}برای فراخوانی متد به صورت زیر می توانیم عمل کنیم:
var item = db.myTable.Active().SingleOrDefault(...);







برگرفته شده از EduOnline.Blog.ir

----------


## RIG000

خوب میشد از تگ کد استفاده میکردی که کدها تو صفحه پریشون نشن. از اینکه مطالب مفید میگذارید هم ممنونیم

----------


## moferferi

سلام.
دوست عزیر اول از بایت زحمت تون تشکر میکنم.
دوم اینکه این روش اموزشی که شما پیش گرفتین اصلا خوب نیست.
مطالب به صورت پراکنده،ناقص و ... هست.

دوستانی که میخوان mvc یاد بگیرن و تازه کار هستن میتونن به لینک زیر برن .یه سری ویدئو فارسی رایگان و خیلی خوب هست که میتونه بهشون کمک کنه

----------

