یک Model چیست؟
· قسمتی از Application است که Domain Logic را پیاده سازی میکند.
· همچنین با عنوان Business Logic نیز شناخته میشود.
· Domain Logic دادههایی را که بین UI و دیتابیس پاس داده میشود، مدیریت میکند.
· برای مثال، در یک سیستم انبار،Model کارش ذخیره سازی اقلام در حافظه و Logic تعیین کننده موجود بودن یک آیتم در انبار میباشد.
یک ViewModel چیست؟
· ViewModel به ما این امکان را میدهد تا از چندین Entity، یک شیء واحد بسازیم.
· بهینه شده برای استفاده و رندر توسط یک View
چرا باید از ViewModel استفاده کنیم؟
• اگر شما بخواهید چندین Model را به یک View پاس دهید، استفاده از ViewModel ایده بسیار خوبی است.
• همچنین امکان Validate کردن ViewModel را به روشی متفاوتتر از Domain Model برای سناریوهای اعتبارسنجی attribute-based را در اختیارمان قرار میدهد.
• برای قالبندی دادهها نیز استفاده میشود.
o برای مثال به یک داده یا مقدار پولی قالبندی شده به یک روش خاص نیاز داریم؟
ViewModel بهترین مکان برای انجام این کار است.
• استفاده از ViewModel تعامل بین Model و View را سادهتر میکند.
مکان قرارگیری ViewModel در پروژه بهتر است کجا باشد؟
- میتواند در یک پوشه با نام ViewModel در ریشه پروژه باشد.
- به صورت یک dll ارجاع داده شده به پروژه.
- در یک پروژه جدا به عنوان یک Service Layer.
Best Practice هایی در زمان استفاده از ViewModelها
- دادههایی را که قرار است در View رندر شوند، داخل ViewModel قرار دهید.
- View باید خصوصیاتی را که نیاز دارد، مستقیما از ViewModel بدست بیاورد.
- وقتی که ViewModel شما پیچیدهتر میشود، بهتر است از یک Mapper استفاده کنید.
اجازه دهید مثالی را در این رابطه براتون بیارم :
در یک View میخواهیم هم لیست اخبار سایت و هم لیست سخنرانان سایت (مثال مربوط به یک پروژه برای همایش است) را نمایش دهیم. خوب طبق مطالب فوق استفاده از ViewModel بهترین راه حل است. ViewModel مربوطه به صورت زیر تعریف شده است :
public class SpeakerAndNewsViewModel { public IEnumerable<News> News { get; set; } public IEnumerable<Speaker> Speakers { get; set; } }
public ActionResult Index() { var news = db.News.OrderBy(r=>r.Date) .Take(3); var speakers = db.Speakers.Take(4); var model = new SpeakerAndNewsViewModel { News=news, Speakers=speakers }; return View(model); }
و View مربوطه را به شکل زیر تغییر میدهیم :
@model Project.Models.SpeakerAndNewsViewModel @{ ViewBag.Title = "Home Page"; } @section news { @foreach (var item in Model.News) { //.. } } @section speakers { @foreach (var item in Model.Speakers) { //... } }
بله، حدس شما درست است استفاده از صفحه کلیدهای مجازی میشه گفت یکی از بهترین راههای ممکن هست، چون در این روشها کلید به صورت سخت افزاری فشرده نمیشود (کلید فشرده شده به صف پیامهای ویندوز نمیرود) در نتیجه نرم افزارها یا سخت افزارهای جاسوس نمیتوانند این اطلاعات را ثبت کنند. و کاربر با خیال راحت میتواند دادههای خود را وارد نمایند (تاکید میکنم این روش فقط جلو این نرم افزارها یا سخت افزارها را میگیرد و تضمینی برای اینکه در زمان ارسال دادههای شما لو نرود ندارد).
خوب حال چه باید کرد؟
یک راه میتواند پیادهسازی صفحه کلید مجازی با کدهای طرف کلاینت مانند جاوا اسکریپت و ویبی اسکریپت است، اما گروهی پلاگینی را توسعه دادهاند که با چند خط کدنویسی ساده به راحتی میتوانید یک صفحه کلید مجازی چندزبانه (با هر زبانی که دلتون میخواد) داشته باشید و از اون در برنامههای خودتون استفاده کنید.
نحوهی نصب:
ایتدا فایلهای مورد نیاز را از سایت سازنده که شامل فایل جاوا اسکریپت ، فایل استایل و یک تصویر (آخرین نسخه) یا از این آدرس به صورت کامل (در حال حاضر نسخه 1.49) دریافت کرده، پس از دریافت فایلها آنها را در هاست خود بارگزاری (آپلود) نمائید. سپس کدهای زیر را در صفحهای که میخواهید صفحه کلید نمایش یابد در بین تگ <head> ... و <head/> قرار دهید.
<script type="text/javascript" src="keyboard.js" charset="UTF-8"></script> <link rel="stylesheet" type="text/css" href="keyboard.css">
مثال:
<input type="text" value="" class="keyboardInput">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript" src="keyboard.js" charset="UTF-8"></script> <link rel="stylesheet" type="text/css" href="keyboard.css"/> </head> <body> <input type="text" value="" class="keyboardInput"/> </body> </html>
با این کار پس از اجرای صفحه مورد نظر خروجی شما مانند تصویر زیر خواهد بود، جهت محدود کردن کلیدها و عملیات دلخواه و سفارشی سازی با پارامترهای دلخواه میتواند از دموهای موجود در سایت سازنده بهره بگیرید.
موفق وموید باشید.
رابطه ای از جدول Type به جدول Category.
به کمک Scaffolding یک کنترلر برای کلاس Tap (شیر آب) میسازیم ، به طور عادی در فایل Create.chtml مقدار گروه را به صورت DropDown نمایش میدهد، حال ما نیاز داریم که خودمان DropDown را برای Type ایجاد کنیم و بعد ارتباط اینها را بر قرار کنیم.
تابع اولی Create را این طوری ویرایش میکنیم :
public ActionResult Create() { ViewBag.Type = new SelectList(db.Types, "Id", "Title"); ViewBag.Category = new SelectList(db.Categories, "Id", "Title"); return View(); }
همان طور که مشخص است ، علاوه بر مقادیر Category که خودش ارسال میکند ، ما نیز مقادیر نوعها را به View مورد نظر ارسال میکنیم.
برای نمایش دادن هر دو DropDownList ویو مورد نظر را به این صورت ویرایش میکنیم :
<div> نوع </div> <div> @Html.DropDownList("Type", (SelectList)ViewBag.Type, "-- انتخاب ---", new { id = "rdbTyoe" }) @Html.ValidationMessageFor(model => model.Category) </div> <div> دسته بندی </div> <div> @Html.DropDownList("Category", (SelectList)ViewBag.Category, "-- انتخاب ---", new { id = "rdbCategory"}) @Html.ValidationMessageFor(model => model.Category) </div>
همان طور که مشاهده میکنید ، در اینجا DropDownList مربوط به Type که خودمان سمت سرور ،مقادیر آن را پر کرده بودیم نمایش میدهیم.
خب شاید تا اینجای کار ، ساده بود ولی میرسیم به اصل مطلب و ارتباط بین این دو DropDownList. (قبل از این قسمت حتما نگاهی به ساختار DropDownList یا همان تگ select بیندازید ، اطلاعات جی کوئری شما در این قسمت خیلی کمک حال شما است)
برای این کار ما از jQuery استفادی میکنیم ، کار به این صورت است که هنگامی که مقدار DropDownList اول تغییر کرد :
- ما Id آن را به سرور ارسال میکنیم.
- در آنجا Category هایی که دارای Type با Id مورد نظر هستند را جدا میکنیم
- فیلدهای مورد نیاز یعنی Id و Title را میگیریم
- و بعد به کمک Json مقادیر را بر میگردانیم
- و مقادیر ارسالی از سرور را در optionهای DropDownList دوم (گروهها ) قرار میدهم
public ActionResult SelectCategory(int id) { var categoris = db.Categories.Where(m => m.Type1.Id == id).Select(c => new { c.Id, c.Title }); return Json(categoris, JsonRequestBehavior.AllowGet); }
$('#rdbTyoe').change(function () { jQuery.getJSON('@Url.Action("SelectCategory")', { id: $(this).attr('value') }, function (data) { $('#rdbCategory').empty(); jQuery.each(data, function (i) { var option = $('<option></option>').attr("value", data[i].Id).text(data[i].Title); $("#rdbCategory").append(option); }); }); });
- ابتدا یک تگ option میسازیم
- مقادیر مربوطه شامل Id که باید در attribute مورد نظر value قرار گیرد و متن آن که باید به عنوان text باشد را مقدار دهی میکنیم
- option آماده شده را به DropDownList دومی (Category ) اضافه میکنیم.
$('#rdbCategory').empty();
بعد از انتخاب :
عرضه نسخه 1 Visual Studio 2014 CTP
نگارش بتای سیلورلایت سه چند روزی است که ارائه شده است.
ویژگیهای جدید آنرا در چند گروه میتوان بررسی کرد:
- بهبودهای گرافیکی : پشتیبانی از GPU و گرافیک سه بعدی - Perspective 3D و Pixel Shaders
- امکان تولید برنامههای Out-of-the-Browser (امکان اجرای برنامههای سیلورلایت مستقل از مرورگر وب)
- بهبودهای حاصل شده در امکانات برنامه نویسی آن: element binding, dynamic resources و ...
- ارائهی پیش نمایش expression blend نگارش 3 جهت پشتیبانی بهتر از Silverlight 3.0
- .NET RIA Services : n-tier application pattern
- پشتیبانی کامل از پخش ویدیوهایی با فرمت HD
- و ...
کتاب الکترونیکی رایگانی که در MIX09 در اینباره توزیع شده است
دریافت
برای مطالعه بیشتر:
A guide to Silverlight 3 new features
Silverlight 3 Announced!
فروم C# 6.0! نیم نگاهی به آینده...
Results and Impact
- Average Latency improved from 350ms to less than 250ms.
- CPU during peak time was [60–40%]. This dropped to [15–25%].
- AWS Cost Reduction by replacing Windows with Linux servers [by 45%]
- Apache benchmarking [89 vs. 57 req/s]: .NET Core — 89.68 requests / second. .NET Framework on Windows — 57.21 requests/second
- JMeter [Throughput — 142.9 vs. 60.5 per second]: .NET Core Solution: Hit 1000 requests on http://XXXX.redbus.pe/ , Throughput was 142.9/Sec. NET Framework on Windows: Hit 1000 requests on http://XXXX.redbus.pe/, Throughput was 60.5/Sec.
- Blazemeter [90% response time — 417ms vs. 1.09s]: .NET Core Solution: 90% Response time was 417ms. .NET Framework on Windows: 90% Response time was 1.09s.