MVC Hur MVC används i EPiServer Agenda • Överblick • MVC – Model View Controller • MVC och EPiServer (Alloytech) • Komponenter • Model • View • Controller • Viewmodel • För- och nackdelar • Exempel • Frågor • Demo? Överblick MVC – Model, View, Controller Request Controller Model Response View MVC och EPiServer Request Controller DB Model / page Viewmodel Response View Komponenter Modell • Motsvarar en sidtyp med egenskaper • Konstrueras på liknande sätt som i PageTypeBuilder • Kan innehålla logik av affärskaraktär (till exempel beräkningar) • Bör inte innehålla logik av presentationskaraktär (till exempel HTML eller CSS) View • Presentation av data • Utgörs av HTML-dokument • Utgörs av filer antingen med ändelse .aspx (Web Forms) eller .cshtml (Razor) • Innehåller presentationslogik. Controller • Klistret mellan vy och modell • Tar emot requests • Konstruerar vymodell av sida + eventuell annan data • Tar hand om användardata (vy -> modell) Viewmodel • Specialanpassad modell • Innehåller sidan (modellen) • Används bara i vy • Möjliggör användandet av återanvändbara vyer • Ska inte innehålla logik av affärskaraktär • Kan (men bör inte) innehålla logik av presentationskaraktär För- och nackdelar Fördelar • Mer i linje med HTTP och webtänk (stateless och utan komplex livscykel för sidor) • Full kontroll över applikationen • Separation of concerns • Testbart och TDD-redo. • Bra för asynkrona och klientbaserade applikationer • Återanvändbarhet Nackdelar • Inget viewstate • Inga färdiga komponenter (pagelist, placeholder etc) • Ökad komplexitet • Inlärningskurva • Funkar bäst för större team / projekt Exempel Model [ContentType( GUID = "cacfa5fc-122d-4002-873e-04cfef4f413c", GroupName = Global.GroupNames.Default, Order = 40)] [SiteImageUrl("~/ClientResources/Extern/images/PageTypeImage.png")] [AvailableContentTypes(Exclude = new[] { typeof(AccountPage), typeof(DriversLogPage), typeof(InformationPage) })] public class SubStartPage : ArticleBasePage { [Display( GroupName = SystemTabNames.Content, Order = 100)] public virtual ContentArea BlockArea { get; set; } } Controller public class SubStartPageController : PageControllerBase<SubStartPage> { public ActionResult Index(SubStartPage currentPage) { var viewmodel = PageViewModel.Create(currentPage); return View(viewmodel); } } View @model PageViewModel<Knowit.EPi.Site.Bilreda.Models.Pages.SubStartPage> @{var children = DataFactory.Instance.GetChildren(Model.CurrentPage.ContentLink as PageReference);} @if (children.Any()) { <!-- SUB MENU--> <div class="row"> <div class="col-lg-12"> @{Html.RenderPartial("SubNavigation", children);} </div> </div> </div> <!--/ SUB MENU--> } @{Html.RenderPartial("DefaultArticleContent", Model.CurrentPage);} <!-- BLOCK AREA--> <div class='row'> <div class='page-blockarea'> <hr /> @Html.PropertyFor(model => model.CurrentPage.BlockArea, new { CssClass = "row equal-height", EditContainerClass = "overflow-hidden" }) </div> </div> <!--/ BLOCK AREA--> Viewmodel public class PageViewModel<T> : IPageViewModel<T> where T : SitePageData { public PageViewModel(T currentPage) { CurrentPage = currentPage; } public T CurrentPage { get; protected set; } public LayoutModel Layout { get; set; } public bool EditMode { get { return EPiServer.Editor.PageEditing.PageIsInEditMode; } } } public static class PageViewModel { public static PageViewModel<T> Create<T>(T page) where T : SitePageData { return new PageViewModel<T>(page); } } Och en sak till… Web Forms kommer ej vara en del i nya ASP.NET 5 http://stephenwalther.com/archive/2015/02/24/top-10-changes-in-asp-net-5-and-mvc-6
© Copyright 2024