چند نکته در MVC
بسم الله الرحمن الرحیم
چندین نکته ساده وجود دارد که قبلا به اکثر آنها پرداختیم اما با توجه به سوالات مختلف در خصوص آنها در اینجا هر یک را به صورت کوتاه بررسی می کنیم تا انشالله جواب پرسش دوستان داده شود.
ارسال یک شی Json به View
public ActionResult Index()
{
return Json (new{firstName="Esmaeil",LastName="Sheidaei"} ,JsonRequestBehavior.AllowGet);
}
Cache کردن اطلاعات در MVC
تمامی پارامترهای این Property به صورت زیر می توانند مقداردهی شوند
<%@ OutputCache Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None |
ServerAndClient "
Shared="True | False"
VaryByControl="controlname"
VaryByCustom="browser | customstring"
VaryByHeader="headers"
VaryByParam="parametername"
VaryByContentEncoding="encodings"
CacheProfile="cache profile name | ''"
NoStore="true | false"
SqlDependency="database/table name pair | CommandNotification"
ProviderName="Provider Name"
%>
مثال
[OutputCache(Duration=1)]
public ActionResult Index()
{
return View();
}
استفاده از . در Razor
مثال را زیر را در نظر بگیرید
@{
string fileName ="logo";
<img src="E:\DownloadFolder\@(fileName).jpg" />
}
در ابتدای آدرس دهی فایل همانطور که مشاهده می کنید نام متغییر خود را درون پرانتز قرار داده ایم، زیرا ما در اینجا می خواهیم مقدار متغییر خود را با "jpg." جمع رشته ای کنیم اما اگر بعد از fileName کاراکتر . را بزنیم Razor تصور می کنید ما به دنبال متدهایی هستیم که می توان بر روی یک String اجرا کرد در نتیجه لیست متدهای سی شارپ را برای ما نمایش می دهد، از همین رو می بایست نام متغییر خود را درون () قرار دهیم.
چاپ کردن یک خط ساده در View ها
در برخی مواقع ممکن است نیاز داشته باشید یک عبارت، یک عنصر HTML و یا هر چیز دیگری را در View خود چاپ کنید.
درون View می توانید به صورت زیر عمل کنید
@{
if(true)
{
Response.Write("<div> Esmaeil Sheidaei at ABLY.ir </div> ");
}
}
درون Controller نیز می توانید به صورت زیر عمل کنید:
public ActionResult Index()
{
if (true)
{
Response.Write("<div> Esmaeil Sheidaei at ABLY.ir </div> ");
}
return View();
}
جلوگیری از پردازش عبارت ها در Razor
ممکن است در میان کدهای Razor خود بخواهید، یک خط را بدون هیچ پردازشی مستقیما به کاربر نمایش دهید برای این کار کافی است عبارت خود را در میان تگ های زیر قرار دهید:
@{
foreach (var item in collection)
{
/**...*/
if (true)
{
/**...*/
<text> Esmaeil Sheidaei at ABLY.ir </text>
}
}
}
تگ <text> باعث می شود محتوای شما توسط Razor پردازش نشود.
فعال کردن قابلیت intellisense برای اشیا dynamic
ما در پروژه خود یک کلاس با نام Person داریم.
از روی کلاس Person یک شی ایجاد می کنیم و شی ایجاد شده را به ViewBag اضافه می کنیم.
public ActionResult Index()
{
Person person = new Person(Id = 1, FirstName = "Esmaeil", LastName = "Sheidaei");
ViewBag.Person = person;
return View();
}
حال می خواهیم از درون View خود به این شی دسترسی داشته باشیم. اگر بخواهیم Property های این شی نیز دسترسی داشته باشیم (هنگامی که . را می زنیم Visual Studio لیست Property های این شی را به ما نمایش دهد) باید به صورت زیر عمل کنیم.
چون Folder کلاس های برنامه خود را using نکرده ایم مجبوریم آدرس دهی را به صورت کامل بنویسیم.
@{
ProjectSampel.Classes.Person person = (ProjectSampel.Classes.Person)ViewBag.Person;
}
طبیعتا اگر حالا بنویسیم person و . را بزنیم لیست Property های این کلاس برای ما نمایش داده می شود.
جلوگیری از اجرای یک Action
در صورتی که می خواهید یک Action توسط کاربران اجرا نشود و تنها بتوان از درون کد آن را فراخوانی کرد می توانید به دو صورت زیر عمل کنید.
دستور [NonAction] باعث می شود این Action توسط کاربران قابلیت اجرا نداشته باشد.
[NonAction]
public ActionResult Index()
{
/**.. Something*/
}
راه ساده ی دیگری نیز وجود دارد و آن تعریف Action مورد نظر به صورت private می باشد.
private ActionResult Index()
{
/**.. Something*/
}
کاربرد ViewModel ها
در برخی از View ها شما نیاز دارید اطلاعات چند Model را نشان دهید برای این کار کافی است یک ViewModel ایجاد و سپس Model های خود را در آن ایجاد نمایید.
مثال:
public class NewViewModel
{
public Model1 model1{ get; set; }
public Model2 model2{ get; set; }
public Model3 model3{ get; set; }
}
در نهایت درون View خود NewViewModel را معرفی می کنیم. مثال
@model NewViewModel
/**..SomeThings*/
استفاده از Partial
در نظر بگیرید یک لیست از Person داریم و می خواهیم برای هر یک از اشیا این لیست تعدادی کنترل ایجاد کنیم.
برای اینکار کافی است یک View به صورت partial ایجاد کنید که شی Person دریافت می کند و سپس در بدنه آن کدی به صورت زیر می نویسیم:
@model Person
<div>@Html.DisplayTextFor(Model=>Model.Firstname) </div>
<div>@Html.DisplayTextFor(Model=>Model.LastName) </div>
/**.. Something*/
حال می خواهیم در View اصلی این partial را فراخوانی کنیم.
@model IEnumerable<Person>
@foreach (var item in Model)
{
@Html.Partial("PartialPerson",item)
}
متد Html.Partial دو پارارمتر را دریافت کرده است، پارامتر اول نام فایل partial ما است، و پارامتر دوم Model ایی است که باید به partial
داده شود.
این روش باعث می شود کدهای تکراری کمتری نوشته شود و همچنین کدها Reusable شوند
ایجاد Section در Layout
ممکن است در Template خود بخواهید بخش هایی را برای نمایش اطلاعات مختلف ایجاد کنید. برای اینکار کافی است از کد زیر استفاده کنید. درون layout خود کد زیر را اضافه کنید:
@RenderSection("Header", false)
در کد بالا پارامتر اول نام Section است و پارمتر دوم مشخص می کند که این Section اختیاری است یا خیر؛ اگر مقدار این پارامتر true باشد صفحات باید از این Section استفاده کنند.
حال برای استفاده از این Section در صفحات می بایست به صورت زیر عمل کنید:
@section Header
{
<img src="logo1.png" />
}
در صورتی که بخواهید بررسی کنید که آیا Section ایی با نام مشخص تعریف شده است یا خیر. می توانید به صورت زیر عمل کنید.
@{
if (IsSectionDefined("Header"))
{
@RenderSection("Header", false)
}
else
{
/**Something*/
}
}