2015-05-13 16 views
5

Sto costruendo viste mobili per un sito MVC4 asp.net e si è verificato un problema. Abbiamo un bel po 'di posti in cui abbiamo un metodo per convertire una vista in una stringa, ma questo metodo non sembra funzionare con displaymodes, trovando quindi sempre la vista predefinita. Per esempio. index.cshtml invece di index.mobile.cshtml.MVC4 RenderViewToString non rispettando le viste mobili

Qualche idea su cosa manca per far sì che questo codice rispetti le modalità di visualizzazione mobile?

public string RenderViewToString(string viewName, object model) 
    { 
     ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 

      if (viewResult.View == null) 
      { 
       var message = String.Format("View '{0}' not found. Searched in the following locations {1}.", 
        viewName, String.Join(", ", viewResult.SearchedLocations)); 
       throw new Exception(message); 
      } 

      var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 
      return stripWhitespaceRx.Replace(sw.GetStringBuilder().ToString(), " ").Trim(); 
     } 
    } 
+0

È necessario passare un argomento esplicito per la visualizzazione di visualizzazioni mobili, non sa che è mobile o meno. – marko

+0

Ho pensato tanto, ma non so dove passare quella discussione. La mia soluzione migliore finora è, nel viewname, assicurarmi di provare prima a trovare una versione mobile e poi di fallback al valore predefinito se non viene trovato nulla. Ma non sembra giusto. –

+0

È necessario creare qualcosa prima della chiamata al metodo precedente, il nome della vista deve essere mobile o nell'oggetto (se è un viewmodel o qualcosa che crea una proprietà, magari chiamata IsMobile, e a seconda che si tratti di un dispositivo mobile di conseguenza). – marko

risposta

0

inizializzare il parametro "viewName" con vista previsto.

Ad esempio, prima di richiamare RenderViewToString, specificare USER AGENT viewName dell'oggetto Request.

if(Request.Browser.IsMobileDevice) 
{ 
    viewName = "~/Views/index.mobile.cshtml"; 
} 
else 
{ 
    viewName = "~/Views/index.cshtml"; 
} 
Problemi correlati