نحوه استفاده از ViewModel در ASP.NET MVC
ASP.NET MVC #18
- تنظیمات پیش فرض باید تغییر کنند تا کلمات عبور حداقل 10 کاراکتر باشند
- کلمه عبور حداقل یک عدد و یک کاراکتر ویژه باید داشته باشد
- امکان استفاده از 5 کلمه عبور اخیری که ثبت شده وجود ندارد
ایجاد اپلیکیشن جدید
در پنجره Solution Explorer روی نام پروژه کلیک راست کنید و گزینه Manage NuGet Packages را انتخاب کنید. به قسمت Update بروید و تمام انتشارات جدید را در صورت وجود نصب کنید.
بگذارید تا به روند کلی ایجاد کاربران جدید در اپلیکیشن نگاهی بیاندازیم. این به ما در شناسایی نیازهای جدیدمان کمک میکند. در پوشه Controllers فایلی بنام AccountController.cs وجود دارد که حاوی متدهایی برای مدیریت کاربران است.
- کنترلر Account از کلاس UserManager استفاده میکند که در فریم ورک Identity تعریف شده است. این کلاس به نوبه خود از کلاس دیگری بنام UserStore استفاده میکند که برای دسترسی و مدیریت دادههای کاربران استفاده میشود. در مثال ما این کلاس از Entity Framework استفاده میکند که پیاده سازی پیش فرض است.
- متد Register POST یک کاربر جدید میسازد. متد CreateAsync به طبع متد 'ValidateAsync' را روی خاصیت PasswordValidator فراخوانی میکند تا کلمه عبور دریافتی اعتبارسنجی شود.
var user = new ApplicationUser() { UserName = model.UserName }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); }
قانون 1: کلمههای عبور باید حداقل 10 کاراکتر باشند
- مقدار حداقل کاراکترهای کلمه عبور به دو شکل میتواند تعریف شود. راه اول، تغییر کنترلر Account است. در متد سازنده این کنترلر کلاس UserManager وهله سازی میشود، همینجا میتوانید این تغییر را اعمال کنید. راه دوم، ساختن کلاس جدیدی است که از UserManager ارث بری میکند. سپس میتوان این کلاس را در سطح global تعریف کرد. در پوشه IdentityExtensions کلاس جدیدی با نام ApplicationUserManager بسازید.
public class ApplicationUserManager : UserManager<ApplicationUser> { public ApplicationUserManager(): base(new UserStore<ApplicationUser>(new ApplicationDbContext())) { PasswordValidator = new MinimumLengthValidator (10); } }
- حال باید کلاس ApplicationUserManager را در کنترلر Account استفاده کنیم. متد سازنده و خاصیت UserManager را مانند زیر تغییر دهید.
public AccountController() : this(new ApplicationUserManager()) { } public AccountController(ApplicationUserManager userManager) { UserManager = userManager; } public ApplicationUserManager UserManager { get; private set; }
- اپلیکیشن را اجرا کنید و سعی کنید کاربر محلی جدیدی ثبت نمایید. اگر کلمه عبور وارد شده کمتر از 10 کاراکتر باشد پیغام خطای زیر را دریافت میکنید.
قانون 2: کلمههای عبور باید حداقل یک عدد و یک کاراکتر ویژه داشته باشند
- در پوشه IdentityExtensions کلاس جدیدی بنام CustomPasswordValidator بسازید و اینترفیس مذکور را پیاده سازی کنید. از آنجا که نوع کلمه عبور رشته (string) است از <IIdentityValidator<string استفاده میکنیم.
public class CustomPasswordValidator : IIdentityValidator<string> { public int RequiredLength { get; set; } public CustomPasswordValidator(int length) { RequiredLength = length; } public Task<IdentityResult> ValidateAsync(string item) { if (String.IsNullOrEmpty(item) || item.Length < RequiredLength) { return Task.FromResult(IdentityResult.Failed(String.Format("Password should be of length {0}",RequiredLength))); } string pattern = @"^(?=.*[0-9])(?=.*[!@#$%^&*])[0-9a-zA-Z!@#$%^&*0-9]{10,}$"; if (!Regex.IsMatch(item, pattern)) { return Task.FromResult(IdentityResult.Failed("Password should have one numeral and one special character")); } return Task.FromResult(IdentityResult.Success); }
- قدم بعدی تعریف این اعتبارسنج سفارشی در کلاس UserManager است. باید مقدار خاصیت PasswordValidator را به این کلاس تنظیم کنیم. به کلاس ApplicationUserManager که پیشتر ساختید بروید و مقدار خاصیت PasswordValidator را به CustomPasswordValidator تغییر دهید.
public class ApplicationUserManager : UserManager<ApplicationUser> { public ApplicationUserManager() : base(new UserStore<ApplicationUser(new ApplicationDbContext())) { PasswordValidator = new CustomPasswordValidator(10); } }
قانون 3: امکان استفاده از 5 کلمه عبور اخیر ثبت شده وجود ندارد
public class PreviousPassword { public PreviousPassword() { CreateDate = DateTimeOffset.Now; } [Key, Column(Order = 0)] public string PasswordHash { get; set; } public DateTimeOffset CreateDate { get; set; } [Key, Column(Order = 1)] public string UserId { get; set; } public virtual ApplicationUser User { get; set; } }
- خاصیت جدیدی به کلاس ApplicationUser اضافه کنید تا لیست آخرین کلمات عبور استفاده شده را نگهداری کند.
public class ApplicationUser : IdentityUser { public ApplicationUser() : base() { PreviousUserPasswords = new List<PreviousPassword>(); } public virtual IList<PreviousPassword> PreviousUserPasswords { get; set; } }
public class ApplicationUserStore : UserStore<ApplicationUser> { public ApplicationUserStore(DbContext context) : base(context) { } public override async Task CreateAsync(ApplicationUser user) { await base.CreateAsync(user); await AddToPreviousPasswordsAsync(user, user.PasswordHash); } public Task AddToPreviousPasswordsAsync(ApplicationUser user, string password) { user.PreviousUserPasswords.Add(new PreviousPassword() { UserId = user.Id, PasswordHash = password }); return UpdateAsync(user); } }
public class ApplicationUserManager : UserManager<ApplicationUser> { private const int PASSWORD_HISTORY_LIMIT = 5; public ApplicationUserManager() : base(new ApplicationUserStore(new ApplicationDbContext())) { PasswordValidator = new CustomPasswordValidator(10); } public override async Task<IdentityResult> ChangePasswordAsync(string userId, string currentPassword, string newPassword) { if (await IsPreviousPassword(userId, newPassword)) { return await Task.FromResult(IdentityResult.Failed("Cannot reuse old password")); } var result = await base.ChangePasswordAsync(userId, currentPassword, newPassword); if (result.Succeeded) { var store = Store as ApplicationUserStore; await store.AddToPreviousPasswordsAsync(await FindByIdAsync(userId), PasswordHasher.HashPassword(newPassword)); } return result; } public override async Task<IdentityResult> ResetPasswordAsync(string userId, string token, string newPassword) { if (await IsPreviousPassword(userId, newPassword)) { return await Task.FromResult(IdentityResult.Failed("Cannot reuse old password")); } var result = await base.ResetPasswordAsync(userId, token, newPassword); if (result.Succeeded) { var store = Store as ApplicationUserStore; await store.AddToPreviousPasswordsAsync(await FindByIdAsync(userId), PasswordHasher.HashPassword(newPassword)); } return result; } private async Task<bool> IsPreviousPassword(string userId, string newPassword) { var user = await FindByIdAsync(userId); if (user.PreviousUserPasswords.OrderByDescending(x => x.CreateDate). Select(x => x.PasswordHash).Take(PASSWORD_HISTORY_LIMIT) .Where(x => PasswordHasher.VerifyHashedPassword(x, newPassword) != PasswordVerificationResult.Failed).Any()) { return true; } return false; } }
سورس کد این مثال را میتوانید از این لینک دریافت کنید. نام پروژه Identity-PasswordPolicy است، و زیر قسمت Samples/Identity قرار دارد.
- برتری های شیرپوینت 2010 نسبت به شیرپوینت 2007 – لیست ها | عارف حکیمی | www.parnianportal.com
- پندهای جوئل اسپالسکی به دانشجویان کامپیوتر | (Afshar Mohebbi) | blog.afsharm.com
- سیر تکاملی Delegate ها - قسمت سوم، Lambda Expression | www.persiadevelopers.com
- مجموعه وبلاگ های یادگیری الکترونیکی در Google Reader | پرهام | www.elb.ir
- Introducing the Microsoft “Roslyn” CTP | Visual Studio Blog | blogs.msdn.com
- Introducing the Microsoft “Roslyn” CTP | CSharpFAQ | blogs.msdn.com
- Microsoft Announces Windows Management Framework 3.0 CTP #1 | Jeff Martin | www.infoq.com
- Mono 2.12 Roadmap | Jonathan Allen | www.infoq.com
- NHibernate Designer 2 | Phillip | www.philliphaydon.com
- Roslyn CTP | Kirill Osenkov - MSFT | blogs.msdn.com
- Roslyn CTP is available | Patrick Smacchia | codebetter.com
- Roslyn CTP Now Available | S.Somasegar | blogs.msdn.com
- Roslyn Syntax Visualizers | Visual Studio Blog | blogs.msdn.com
- The Roslyn Preview Is Now Available | Eric Lippert | blogs.msdn.com
- Windows Server 8 | Bill Laing, Manlio Vecchiet, Max Herrmann, Mike Neil | channel9.msdn.com
- آیا میدانید چطور میتوان تعداد اتصالها به اس کیوال سرور را محدود کرد؟ | beyondrelational.com
- بهینه سازیهای SIMD کامپایلر سی++ ویژوال استودیو 11 | blogs.microsoft.co.il
- ترجیح اوراکل بیشتر به جاوای نگارش سازمانی است تا پشتیبانی دسکتاپ | rss.slashdot.org
- مطابق قوانین کانادا لینک دادن اشکالی ندارد! | rss.slashdot.org
- نحوه استفاده از Stack Exchange API | channel9.msdn.com
در مورد تنظیمات دستی IIS Express که یک نسخهی سبک IIS 7.5 قابل اجرا بر روی ویندوز XP نیز میباشد، پیشتر در این سایت مطلبی را مطالعه کردهاید (+). اکنون که سرویس پک یک VS 2010 ارائه شده (+)، دیگر نیازی به آن تنظیمات دستی نبوده و امکان استفاده یکپارچه و خودکار از این نسخهی ساده شده IIS 7.5 به شرح زیر وجود دارد:
ابتدا نیاز است تا هر دو مورد سرویس پک یک VS 2010 و همچنین IIS Express به صورت جداگانه نصب شوند. سپس:
الف) ابتدا از منوی Tools ، گزینهی Options را انتخاب کنید. در صفحهی باز شده در قسمت Projects and solutions ذیل گزینهی Web projects نیاز است تا یکبار مجوز استفاده از IIS express صادر شود:
ب) اکنون بر روی نام پروژه در Solution explorer موجود در Visual studio کلیک راست کرده و گزینهی Use IIS Express را انتخاب نمائید:
به این صورت تنظیمات لازم به صورت خودکار اعمال خواهد گردید و جهت مشاهده آنها میتوان به خواص پروژه، برگهی Web مراجعه کرد:
نکته مهم:
نسخهی RTM ویژوال استودیوی 2010 تنظیمات فوق را که در تصویر ملاحظه میکنید، ندارد. به عبارتی پس از اعمال تغییرات فوق باید دقت داشت سایرینی که قرار است از پروژهی شما استفاده کنند نیز باید پیشنیازهای ذکر شده را رعایت نمایند و یا جهت توزیع سورس میتوان مجددا بر روی نام پروژه کلیک راست کرده و اینبار گزینهی Use Visual Studio Development Server قدیمی را انتخاب کرد.
در مقاله قبلی ، درباره دلایل استفاده از Xamarin ، کمی صحبت کردیم. حال وقت آن رسیده که به سراغ نصب و راه اندازی اولین پروژه زمارین برویم.
اگر شما از Visual Studio 2015 به بعد استفاده کنید، موقع نصب قادر خواهید بود که با انتخاب گزینه Mobile Development و انتخاب Xamarin ، آن را نصب و همچنین تمامی فایلهای مربوط به آن را دریافت کنید. در نظر داشته باشید که در طول این پروسه شما باید از ف.یل.تر شکن استفاده کنید، چرا که بعضی از فایلها مانند Android Sdk بر روی سرور گوگل قرار دارد و گوگل آپیهای ایران را برای برنامه نویسان فیلتر کرده است (البته اگر بستهی کامل VS 2017 را دریافت کرده باشید، تمام این پیش نیازها، به همراه این بستهی 21~ گیگابایتی موجود است و این مشکلات را نخواهید داشت).
حال اگر در حال حاضر Visual Studio را بر روی سیستم خود نصب دارید و زمارین را نصب نکرده اید میتوانید از طریق خود سایت زمارین اقدام به دانلود آن بکنید. در نظر داشته باشید، وقتیکه فایل نصبی را از سایت دریافت میکنید، برنامه شروع به نصب خودکار زمارین و تمامی موارد مورد نیاز خود میکند که در این مورد هم به ف.یل.تر شکن نیاز دارید (منهای بستهی کامل VS 2017 که پیشتر عنوان شد). همانطور که بالا گفته شد فایل هایی مانند Android Sdk را نمیتوان از آی پی ایران دانلود کرد (مگر اینکه از سایتهای واسط استفاده کنید).
پس از موافقت با حقوق کپی رایت زمارین، سیستم شما
را جستجو کرده و تمامی موارد مورد نیاز را که نیاز به نصب دارند، به شما نشان
داده و نصب خواهد کرد.
اگر همه مراحل با موفقیت به پایان برسد، پیغامی مبنی بر موفقیت آمیز بودن عملیات را دریافت خواهید کرد. اما اگر به هر دلیلی فایل نصبی نتواند فایلهای مورد نیاز را دانلود کند، پیغامی مبنی بر شکست عملیات دانلود فایل مورد نظر را دریافت میکنید. در این صورت میتوانید صفحهای را مشاهده کنید که درون آن تمامی فایلهای دانلود نشده و لینک دانلود مستقیم آنها قرار دارند و شما میتوانید فایلهای offline آنها را دانلود کرده و به صورت دستی بر روی سیستم نصب نمایید.
اگر تمامی فایلهای مورد نظر را دانلود کرده باشید، قادر خواهید بود اولین پروژهی خود را شروع کنید. قبل از اینکه کار با زمارین را شروع کنیم، اجازه دهید از اینکه ویژوال استودیو تمامی فایلهای نصب شده را تشخیص داده یا خیر، مطمئن شویم. ویژوال استودیوی خود را باز کرده و از منوی Tools، گزینهی Options را انتخاب و بعد از باز شدن صفحه مورد نظر، در انتهای لیست، گزینه Xamarin را انتخاب کنید.
اگر تمامی مراحل با موفقیت انجام شده باشند، ویژوال استودیو تمامی فایلها را به صورت خودکار تشخیص خواهد داد. اما اگر ویژوال استودیو به هر دلیلی هر کدام از اینها را تشخیص نداد، ابتدا از نصب بودن آنها اطمینان حاصل نمایید و سپس به صورت دستی مسیر آنها را مشخص کنید.
نکته : در نظر داشته باشید فایلهای زیر برای اجرای برنامه بر روی اندروید میباشند و اگر شما تمایلی به اجرای نرم افزار خود را بر روی اندروید ندارید، میتوانید از آنها صرف نظر کنید.
در این مرحله میخواهیم اولین برنامه زمارین خود را شروع کنیم. همانطور که در مقاله قبلی توضیح داده شد، شما میتوانید از xamarin forms و یا xamarin native استفاده کنید. Xamarin forms ساختاری برای code sharing میباشد که توسط شرکت زمارین توسعه داده شدهاست. به این ترتیب شما قادر خواهید بود که با استفاده از Xamarin Forms با نوشتن کمترین کد، نرم افزار خود را بر روی پلتفرمهای پشتیبانی شدهی توسط زمارین اجرا کنید. استفاده از Xamarin Forms برای یک پروژهی تجاری بسیار مناسب میباشد؛ اما در برخی موارد شما باید از Xamarin Native هم استفاده نمایید که در این صورت هم زمارین دست شما را نخواهد بست و قادر خواهید بود که به صورت ترکیبی از Xamarin Forms و Xamarin Native از آن استفاده نمایید.
حال به سراغ ساخت اولین پروژه زمارین برویم. در ابتدا برای ایجاد یک پروژه، از منوی File گزینه New و سپس گزینه Project را انتخاب کنید. در پنجره باز شده از سمت چپ گزینه C# را انتخاب و از زیر منوی Cross Platform گزینه Cross Platform App را انتخاب کنید.
پس از تایید با صفحه زیر مواجه خواهید شد.
در این قسمت همانطورکه مشاهده میکنید میتوانید از دو نوع قالب استفاده کنید و همانطور که از نام آنها مشخص است، Master Detail دو پروژه خواهد ساخت که میتوانید از آن برای سناریوهای خاص استفاده کنید. در قسمت پایین، UI Technology مشخص کنندهی شیوه پیاده سازی ظاهر برنامه است. زمارین فرم برای پیاده سازی ظاهر برنامه از Xaml استفاده میکند و شما میتوانید از طریق آن ظاهر تمامی پلت فرمها را پیاده کنید. همچنین قادر خواهید بود بجای استفاده از Xaml، از زبانهای مخصوص هر پلتفرم مانند Xml برای اندروید استفاده کرده و ظاهر نرم افزار خود را با استفاده از آن پیاده کنید.
زمارین فرم برای Code Sharing از دو روش استفاده میکند.
Shared Project
مزایا:
· شما به تمامی قسمتهای یک پلتفرم دسترسی دارید.
· قادر خواهید بود کدهایی مخصوص به هر پلتفرم را بنویسید.
· میتوانید با استفاده از Conditional Compilation، بر اساس نوع پلتفرم، شروطی را اعمال نمایید.
معایب:
· شما با این روش نمیتوانید DLL ایی را تولید کنید و از آن در پروژههای دیگر استفاده نمایید.
· نوشتن Unit Testing نسبت به روش Portable پیچیدهتر است.
Portable Class Library
مزایا:
· شما قادر خواهید بود از پروژه خود DLL تهیه کرده و در مابقی پروژهها از آن استفاده کنید.
· نوشتن Unit Test به سادگی امکان پذیر است.
معایب:
· در این روش شما نمیتوانید از کدهای مخصوص به هر پلتفرم ( Platform-Specific ) استفاده کنید (البته با استفاده از Dependency Injection امکان پذیر است).
· فقط قادر خواهید بود که از زیر مجموعه .Net استفاده نمایید.
در ادامه پس از انتخاب Xamarin Forms و Shared Project، بر روی Ok کلیک کنید. همانطور که میبینید ویژوال استودیو شروع به ساخت پروژههای برنامه میکند. اگر تمامی Sdk های مورد نیاز را نصب کرده باشید، ویژوال استدیو 5 پروژه را برای شما میسازد (در نظر داشته باشید که اگر SDK مربوط به Universal Windows Platform را هم نصب کرده باشید، پروژهی مربوط به آن را نیز خواهید دید).
اولین پروژه، پروژه Shared است که کدهای برنامه در این پروژه نوشته خواهد شد.
دومین پروژه همانطور که از پسوند آن مشخص است، پروژه مربوط به اندروید است. در نظر داشته باشید که پروژههایی که مربوط به پلتفرمها میباشند، برای نوشتن کدهای مخصوص به هر پلتفرم در دسترس میباشند و کدهای نوشته شده در این پروژهها و پروژه Shared ترکیب شده و بعد کامپایل میشوند.
در زمارین برنامهها از فایلی به نام App
اجرا میشوند. این فایل علاوه بر دسترسی به Life Cycle اپلیکیشن، وظیفهی دیگر آن مشخص کردن اولین
صفحهی برنامه نیز میباشد. این فایل درون پروژه Shared قرار دارد.
همانطور که مشاهده میکنید پس از باز کردن فایل App، در متد سازنده آن صفحه اصلی، به صفحهای به نام MainPage که یک فایل Xaml میباشد، تنظیم شدهاست. پس از باز کردن فایل MainPage با کدهای زیر مواجه میشویم.
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:PreviewerTest" x:Class="PreviewerTest.MainPage"> <Label Text="Welcome to Xamarin Forms!" VerticalOptions="Center" HorizontalOptions="Center" /> </ContentPage>
که مشخص کننده یک لیبل با متن Welcome to Xamarin Forms! میباشد. پس از اجرای برنامه میتوانیم کد اجرا شده را مشاهده کنیم.