2014-12-15 16 views
9

Sto riscontrando un problema in cui gli utenti sui dispositivi mobili riscontrano un errore in MVC che non si verifica durante la visualizzazione del sito su un normale desktop. Posso costantemente riprodurre l'errore utilizzando gli strumenti di sviluppo di Chrome e applicare qualsiasi altra UA oltre a quella predefinita.Cause agente utente MVC DisplayFor ArgumentException: caratteri non validi nel percorso

L'eccezione sottostante gettato è: ArgumentException: Illegal characters in path. at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) at System.IO.Path.GetExtension(String path) at System.Web.WebPages.DefaultDisplayMode.TransformPath(String virtualPath, String suffix) at System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func'2 virtualPathExists) at System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func'2 virtualPathExists, IDisplayMode currentDisplayMode, Boolean requireConsistentDisplayMode) at System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext, List'1 locations, String name, String controllerName, String areaName, String cacheKey, String[]& searchedLocations) at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations) at System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView(ControllerContext controllerContext, String partialViewName, Boolean useCache) at System.Web.Mvc.ViewEngineCollection.<>c__DisplayClass2.<FindPartialView>b__1(IViewEngine e) at System.Web.Mvc.ViewEngineCollection.Find(Func'2 lookup, Boolean trackSearchedPaths) at System.Web.Mvc.ViewEngineCollection.FindPartialView(ControllerContext controllerContext, String partialViewName) at System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html, ViewDataDictionary viewData, String templateName, DataBoundControlMode mode, GetViewNamesDelegate getViewNames, GetDefaultActionsDelegate getDefaultActions) at System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate) at System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData) at System.Web.Mvc.Html.TemplateHelpers.TemplateFor[TContainer,TValue](HtmlHelper'1 html, Expression'1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper) at System.Web.Mvc.Html.TemplateHelpers.TemplateFor[TContainer,TValue](HtmlHelper'1 html, Expression'1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData) at System.Web.Mvc.Html.DisplayExtensions.DisplayFor[TModel,TValue](HtmlHelper'1 html, Expression'1 expression)

Utilizzando violinista, l'unica differenza nelle richieste quando si confrontano un successo per una richiesta non riuscita è l'User-Agent (e il busting della cache apposta da jQuery come parte del parametri della stringa di query).

Perché è solo la modifica della UA che causa questa eccezione e come posso evitare questo problema senza scrivere un lavoro specifico nel sistema per ogni posto che è e potrebbe accadere?

+0

Hai trovato una soluzione a questo? –

+0

@RomanMik - In realtà ho trovato lo stesso lavoro di CSJ al di sotto del quale evitare i blocchi di rendimento nei miei modelli di vista. Dopo aver modificato il codice per materializzare l'elenco anziché utilizzare il rendimento, il problema è stato risolto. Non riesco ancora a comprendere appieno perché ciò avvenga in .NET con determinati programmi utente, ma almeno c'è un modo standard per aggirarlo. – SignalRichard

+0

Ho trovato una soluzione diversa correlata a ASP.NET DisplayModeProvider che ho condiviso nell'articolo SO correlato http://stackoverflow.com/questions/33694842/illegal-characters-in-path-depending-on-user-agent/40229384#40229384 –

risposta

9

Ho avuto lo stesso identico problema e l'ho risolto.

Il mio problema si è rivelato essere l'uso di un blocco yield nel mio ViewModel:

Controller:

var vm = new BigVM { 
    SmallVMs = BuildSmallOnes() 
}; 
return View(vm); 

private IEnumerable<SmallVM> BuildSmallOnes() 
{ 
    // complex logic 
    yield return new SmallVM(1); 
    yield return new SmallVM(2); 
} 

Vista:

@model BigVM 
@Html.DisplayFor(x => x.SmallVMs) <-- died 

Inspiegabilmente, questo ha funzionato per i desktop, ma non è riuscito per iPad e iPhone, citando lo stesso stacktrace. Problemi simili sono stati segnalati here e here. Il problema è stato risolto con l'aggiunta di una chiamata .ToList(), in tal modo:

var vm = new BigVM { 
    SmallVMs = BuildSmallOnes().ToList() 
}; 

Presumibilmente la classe che il compilatore genera per rappresentare il blocco di rendimento include alcuni caratteri che alcuni agenti utente proprio non mi piace. L'inclusione della chiamata ToList() utilizza invece un elenco <>.

+0

'ToList()' ha risolto il problema anche per me. L'uso di 'Where (...)' sembra funzionare correttamente (quindi il tipo effettivo passato alla vista è 'WhereListIterator '), ma dopo aver applicato 'OrderBy (...). Take (...)' (così il risultato finale è 'Enumerable. ...'), la vista si è bloccata sui dispositivi mobili. –

+0

Immagino che il problema esista per molti dei tipi IEnumerable ; Forse usare IList (e quindi impedirti di dimenticare 'ToList()') nei modelli di visualizzazione dovrebbe essere una "best practice" per creare una rete di sicurezza per il tempo di compilazione? –

+0

Ho appena avuto lo stesso problema. IEnumerable e rendimento utilizzato da un builder viewmodel. Qualcuno sa cosa, esattamente, causa il problema? Questo puzza di bug nel motore di visualizzazione. –

Problemi correlati