PDA

View Full Version : سوال: تغییر روش استفاده از VIewModel برای صفحات Layout



morika
یک شنبه 03 اسفند 1393, 16:25 عصر
سلام
برای ارسال یه Model به یه صحفه Layout باید یه ViewModel درست کرد و بعدا به مام Action هایی که View اونها در اون Layout باز میشه اطلاعات این ViewModel رو اضافه کرد که Layout بتونه اون اطلاعات رو بخونه. حالا اگه یه تغییری بخوایم تو ViewModel بدیم باید بریم تمام اون Action هارو پیدا کنیم و Update کنیم. به نظر این کار استانداردی هست که تو همه آموزش ها چه خارجی چه پارسی من پیدا کردم. حالا سوالم این هست که اگه ما بیان اطلاعاتی که Layout لازم داره رو بدون استفاده از ViewModel تو خود صفحه Layout بین کدهای HTML براش تعیریف کنیم چه اشکالی داره؟ یعنی تو خود صفحه Layout به نمونه از ApplicationDbContext بگیریم و تمام اطلاعات جداولی که لازم داریم همونجا لود کنیم و کارمون رو انجام بدیم؟ مزیتش امکان Update کردن اسون اون هست. دیگه برای هر تغییر کوچیکی لازم نیست دنبال Action بگردیم و تغییرش بدیم.
ممنون

karadous
چهارشنبه 06 اسفند 1393, 16:11 عصر
روش دیگر میتونه این باشه که شما یک Controller تعریف کنید و در آن OnActionExecuting را override کنید. این متد قبل از اجرای هر Action اجرا می شود. در داخل این متد می توانید کار مورد نظر را انجام دهید. حال تمام Controller های دیگر را از این Controller ارث بری کنید. با ین کار قبل از فراخوانی هر Action از هر کدام از Controller ها متد OnActionExecuting فراخوانی خواهد شد. مانند کد زیر:




public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var db = new MyEntities();
ViewBag.Count = db.MyTable.Count();
}
}
public class HomeController : BaseController
{
public ViewResult Index()
{
return View();
}
}

morika
پنج شنبه 07 اسفند 1393, 01:06 صبح
خب بله اینم واسه خودش یه روشی هست. خیلی ممنون. فقط من می خواستم بدونم اینکه این کارو توی خود صفحه Layout انجام بدیم اشکال فنی داره یا نه؟

مهدی کرامتی
پنج شنبه 07 اسفند 1393, 08:43 صبح
اشکال فنی که نه، اما با توجه به اینکه View ها کامپایل نمی شوند و توسط یک Script Processor اجرا می شوند، در صورتی که Query شما سنگین باشد باعث کند شدن اجرای برنامه می شود.

r4hgozar
پنج شنبه 07 اسفند 1393, 09:42 صبح
سلام.
البته استاد کرامتی جواب دادن.
اما من هم از همین روش استفاده می کنم.
شما وقتی میای از viewmodel استفاده می کنی معمولا یه به اصطلاح business layer یا BL هم داری که db رو اونجا باز می کنی و یا دیسپوز. تا پایگاه داده همه جا و الکی باز نشه و مدیریت بهتری بشه.
شما واسه اینکه action شما شلوغ نشه و مدیریت بهتری روی پروژه داشته باشین می تونین از class library های مختلف استفاده کنین و لایه هایی به نام repository داشته باشین و ارتباط مستقیم و تمیز رو در این لایه با دیتابیس داشته باشین .
می تونین لایه service یا به نام دیه ای هم داشته باشین و ایجا بیاین و قسمتی از مباحث محاسباتی خودتون رو در این لایه انجام بدین تا action تمیز تر و خلوت تری رو داشته باشین.
البته برای این نوع کد نویسی باید کار با Interface ها رو بلد باشین که مبحثی در سی شارپه و dependency injection رو هم یاد بگیرین که معمولا با ninject یا structure map انجام میشه.
موفق باشید