MVC

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