unit WebSiteControllerU; interface uses MVCFramework, System.Diagnostics, System.JSON, MVCFramework.Commons; type [MVCPath('/')] TWebSiteController = class(TMVCController) protected procedure OnBeforeAction(Context: TWebContext; const AActionNAme: string; var Handled: Boolean); override; procedure GeneratePeopleListAsCSV; public [MVCPath('/people')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_HTML)] procedure PeopleList; [MVCPath('/people')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_CSV)] // RESTful API, requires ACCEPT=text/csv procedure ExportPeopleListAsCSV_API; [MVCPath('/people/formats/csv')] [MVCHTTPMethods([httpGET])] // Route usable by the browser, doesn't requires ACCEPT=text/csv procedure ExportPeopleListAsCSV; [MVCPath('/people')] [MVCHTTPMethods([httpPOST])] [MVCConsumes(TMVCMediaType.APPLICATION_FORM_URLENCODED)] procedure SavePerson; [MVCPath('/deleteperson')] [MVCHTTPMethods([httpPOST])] [MVCConsumes(TMVCMediaType.APPLICATION_FORM_URLENCODED)] procedure DeletePerson; [MVCPath('/new')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_HTML)] procedure NewPerson; [MVCPath('/edit/($guid)')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_HTML)] procedure EditPerson(guid: string); [MVCPath('/')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_HTML)] procedure Index; [MVCPath('/showcase')] [MVCHTTPMethods([httpGET])] [MVCProduces(TMVCMediaType.TEXT_HTML)] procedure MustacheTemplateShowCase; end; implementation { TWebSiteController } uses DAL, System.SysUtils, Web.HTTPApp; procedure TWebSiteController.DeletePerson; var lGUID: string; LDAL: IPeopleDAL; begin lGUID := Context.Request.Params['guid']; LDAL := TServicesFactory.GetPeopleDAL; LDAL.DeleteByGUID(lGUID); Redirect('/people'); end; procedure TWebSiteController.EditPerson(guid: string); var LDAL: IPeopleDAL; lPerson: TPerson; lDevices: TDeviceList; lItem: TDevice; begin LDAL := TServicesFactory.GetPeopleDAL; lPerson := LDAL.GetPersonByGUID(guid); try lDevices := LDAL.GetDevicesList; try ViewData['person'] := lPerson; for lItem in lDevices do begin lItem.Selected := lPerson.Items.Contains(lItem.DeviceName); end; ViewData['deviceslist'] := lDevices; LoadView(['header', 'editperson', 'footer']); RenderResponseStream; finally lDevices.Free; end; finally lPerson.Free; end; end; procedure TWebSiteController.ExportPeopleListAsCSV; begin GeneratePeopleListAsCSV; // define the correct behaviour to download the csv inside the browser ContentType := TMVCMediaType.TEXT_CSV; Context.Response.CustomHeaders.Values['Content-Disposition'] := 'attachment; filename=people.csv'; end; procedure TWebSiteController.ExportPeopleListAsCSV_API; begin GeneratePeopleListAsCSV; end; procedure TWebSiteController.GeneratePeopleListAsCSV; var LDAL: IPeopleDAL; lPeople: TPeople; begin LDAL := TServicesFactory.GetPeopleDAL; lPeople := LDAL.GetPeople; try ViewData['people'] := lPeople; LoadView(['people_header.csv', 'people_list.csv']); RenderResponseStream; // rember to call RenderResponseStream!!! finally lPeople.Free; end; end; procedure TWebSiteController.Index; begin Redirect('/people'); end; procedure TWebSiteController.MustacheTemplateShowCase; var LDAL: IPeopleDAL; lPeople, lPeople2: TPeople; lMyObj: TMyObj; begin LDAL := TServicesFactory.GetPeopleDAL; lPeople := LDAL.GetPeople; try lPeople2 := TPeople.Create; try lMyObj := TMyObj.Create; try lMyObj.RawHTML := '