2014-12-15 32 views
9

Mobil aygıtlardaki kullanıcıların MVC'de, siteyi normal bir masaüstünde görüntülerken oluşmayan bir hatayla karşılaştığı bir sorun yaşıyorum. Chrome’un geliştirici araçlarını kullanarak ve varsayılandan başka bir UA’yı uygulayarak sürekli olarak hata oluşturabilirim.Kullanıcı Aracısı MVC DisplayFor'a karşı ArgumentException: Yoldaki geçersiz karakterler

atılan yatan istisna değildir: kemancı kullanma 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)

, başarısız bir isteğine başarılı olanı karşılaştırarak istekleri tek fark User-Agent (ve bir parçası olarak jQuery tarafından eklenen önbellek engelleyici olduğunu sorgu dizesi parametreleri.

Neden UA'yı bu istisnaya neden değiştiriyorsunuz ve bu durumun oluşabileceği her yer için sisteme özel bir çalışma yazmadan bu sorunu nasıl önleyebilirim?

+0

Bunun için bir çözüm buldunuz mu? –

+0

@RomanMik - Aslında aynı işi, model modellerimde verim bloklarını kullanmaktan kaçınmak için aşağıda CSJ olarak buldum. Verimi kullanmak yerine listeyi gerçekleştirecek kodu değiştirdikten sonra sorun çözüldü. Bunun hala neden bazı kullanıcı aracıları ile .NET'te gerçekleştiğini tam olarak anlamadım ama en azından etrafta çalışmak için standart bir yol var. – SignalRichard

+0

İlgili SO makalesinde paylaştığım ASP.NET DisplayModeProvider ile ilgili farklı bir çözüm buldum http://stackoverflow.com/questions/33694842/illegal-characters-in-path-depending-on-user-agent/40229384#40229384 –

cevap

9

Aynı problemi çözdüm ve düzeltdim.

Benim sorun benim ViewModel bir yield bloğunun kullanımı olduğu ortaya çıktı:

Denetleyici:

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); 
} 

Görünüm:

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

Açıklanamaz, bu masaüstü çalıştı ama başarısız oldu iPads ve iPhone'lar için, aynı stacktrace'i gerekçe göstererek. Benzer problemler here ve here bildirilmiştir. Sorun böylece bir .ToList() çağrı ekleyerek çözüldü:

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

Tahminen derleyici verim bloğunu temsil etmek oluşturduğu sınıf bazı Kullanıcı Ajanlar sadece sevmiyorum bazı karakterler içerir. ToList() çağrısı dahil, bunun yerine bir List <> kullanır.

+0

'ToList()' benim için de sorunu çözdü. Sadece 'Where (...)' yi kullanmak gayet iyi görünüyor (bu yüzden gerçek tip görünümüne geçildi "WhereListIterator "), ancak 'OrderBy (...)' yi uyguladıktan sonra (...) Sonuçta "Numaralandırılabilir. ...'), görünüm mobil cihazlarda çöktü. –

+0

IEnumerable türlerinin birkaçında sorun var sanırım; Belki de IList 'u kullanarak (ve böylece 'ToList()') unuzu unutmaktan alıkoyan modeller, derleme zamanı güvenlik ağı oluşturmak için "en iyi uygulama" olmalıdır? –

+0

Sadece aynı problemi yaşadım. IEnumerable ve bir viewmodel oluşturucu tarafından kullanılan verim. Sorun, neden tam olarak ne olduğunu bilen var mı? Bu, görünüm motorunda bir hata gibi kokuyor. –