Pornim de la următoarea problema:
Proprietatea user agent-ul se poate găsii în următoarea locație
Altfel ajunge sa returnam o instanta noua a ViewEngineResult. Deoarece aceasta nu o sa conțină nici un view găsit, căutarea se va face in continuare în alt ViewEngine din colecție.
Se da o aplicație ASP MVC 3. Se dorește sa încarce view-uri custom pentru fiecare tip de device care o accesează. De exemplu în cazul în care request-ul vine de la un iPhone sau un Windows Phone 7 atunci view-urile care se încarcă o sa fie diferite.MVC suporta deja crearea unei versiuni de view pentru mobile device, dar acest lucru nu o sa ne fie de ajuns. In funcție de rezoluție sau de brower o sa dorim sa încărcam view-uri total diferite. Informațiile despre ce tip de device accesează resursa le putem găsii in user-agent.
Proprietatea user agent-ul se poate găsii în următoarea locație
HttpContext.Request.UserAgent
Aceasta valoare o sa fie de tip string, unde este necesar sa cautam manual valoarea pe noi o cautam. Pentru IPhone user agent-ul o sa aibe valoarea:Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3
Iar un request de la un Windows Phone 7 o sa aibe următoarea valoare:Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6
Sa presupunem ca o sa avem următoarea structura de fișiere sub directorul ViewsViews
Home // Nume control
Index.cshtml
IPhone
Index.cshtml
WF7
Index.cshtml
Pentru a definii maparea la views-uri astfel încît sa fie rezolvate cu view-ul dorit este nevoie sa implementam interfața IViewEngine și sa ne definim un ViewEngine custom. In cadrul acestui ViewEngine pe metodele FindPartialView si FindView o sa fie nevoie sa verificam dacă user agent-ul este de la un anumit agent. In cazul în care request-ul vine de la un anumit device custom atunci este nevoie sa transmitem path-ul unde se găsește view-ul respectiv.Altfel ajunge sa returnam o instanta noua a ViewEngineResult. Deoarece aceasta nu o sa conțină nici un view găsit, căutarea se va face in continuare în alt ViewEngine din colecție.
public class ApplePhoneViewEngine : IViewEngine
{
...
public ViewEngineResult FindPartialView(ControllerContext context, string viewName, bool useCache)
{
return context.HttpContext.Request.UserAgent.StartWith("iPhone)
? BaseViewEngine.FindPartialView(context, "IPhone/" + viewName, false)
: new ViewEngineResult(new string[] { });
}
...
}
Ne-a mai rămas sa înregistram view engine-ul pe care noi l-am definit mai sus. In Application_Start din Global.asax.cs este nevoie sa adaugăm următorul cod:ViewEngines.Engines.Add(new ApplePhoneViewEngine());
Codul se poate refactoriza destul de frumos, dar va las pe voi sa faceți acest lucru. Daca doriți sa aflați mai multe informații puteți sa aruncați o privire aici: https://raw.github.com/gist/1077436/a35a62ce4be85ab439dacf44205792ca9ff2791d/customviewengine.cs
MVC 4 are asa ceva... si e developer preview
ReplyDeleteAm vazut, dar pana atunci ne descurcam cu ce avem, sunt multumit si cu MVC 3.
ReplyDelete