2014-12-15 14 views
9

Tôi gặp sự cố khi người dùng trên thiết bị di động gặp phải lỗi trong MVC không xảy ra khi xem trang web trên máy tính để bàn thông thường. Tôi liên tục có thể tạo lại lỗi bằng cách sử dụng các công cụ dành cho nhà phát triển của Chrome và áp dụng bất kỳ UA nào khác so với mặc định.Tác nhân người dùng Hiển thị MVC cho đối tượng ArgumentException: Các ký tự không hợp lệ trong đường dẫn

Trường hợp ngoại lệ cơ bản ném là: 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)

Sử dụng cáy, sự khác biệt duy nhất trong các yêu cầu khi so sánh một thành công để yêu cầu thất bại là User-Agent (và buster bộ nhớ cache nối bởi jQuery như một phần của tham số chuỗi truy vấn).

Tại sao chỉ thay đổi UA gây ra ngoại lệ này và làm cách nào tôi có thể tránh vấn đề này mà không viết một công việc cụ thể xung quanh vào hệ thống cho mọi địa điểm này và có thể xảy ra?

+0

Bạn có tìm thấy giải pháp cho điều này không? –

+0

@RomanMik - Tôi thực sự đã tìm thấy cùng một công việc xung quanh dưới dạng CSJ bên dưới để tránh sử dụng các khối lợi nhuận trong các mô hình chế độ xem của tôi. Sau khi tôi thay đổi mã để thực hiện danh sách thay vì sử dụng lợi nhuận, vấn đề đã được giải quyết. Tôi vẫn không hoàn toàn hiểu tại sao điều này xảy ra trong .NET với một số tác nhân người dùng nhất định nhưng ít nhất có một cách tiêu chuẩn để làm việc xung quanh nó. – SignalRichard

+0

Tôi tìm thấy một giải pháp khác liên quan đến ASP.NET DisplayModeProvider mà tôi đã chia sẻ trong bài viết SO có liên quan http://stackoverflow.com/questions/33694842/illegal-characters-in-path-depending-on-user-agent/40229384#40229384 –

Trả lời

9

Tôi đã gặp sự cố tương tự và sửa lỗi đó.

Vấn đề của tôi hóa ra là việc sử dụng một khối yield trong viewmodel của tôi:

Bộ điều khiển:

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

Xem:

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

Không hiểu sao, điều này làm việc cho máy tính để bàn nhưng không thành cho iPad và iPhone, trích dẫn chính xác cùng một stacktrace. Các sự cố tương tự đã được báo cáo herehere. Vấn đề đã được giải quyết bằng cách thêm một cuộc gọi .ToList(), như sau:

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

Có lẽ lớp mà trình biên dịch tạo ra để đại diện cho khối lượng bao gồm một số nhân vật mà một số User Agents chỉ không thích. Bao gồm cả cuộc gọi ToList() sử dụng danh sách <> thay thế.

+0

'ToList()' cũng cố định vấn đề cho tôi. Chỉ cần sử dụng 'Where (...)' có vẻ hoạt động tốt (vì vậy loại thực tế được truyền cho view là 'WhereListIterator '), nhưng sau khi áp dụng 'OrderBy (...). Take (...)' (như vậy kết quả cuối cùng là 'Enumerable. ...'), chế độ xem bị lỗi trên thiết bị di động. –

+0

Tôi đoán vấn đề tồn tại đối với một số loại IEnumerable ; Có thể sử dụng IList (và do đó ngăn cản bạn quên mất 'ToList()') trong các mô hình xem nên là một "thực hành tốt nhất" để tạo ra một mạng lưới an toàn thời gian biên dịch? –

+0

Tôi vừa gặp vấn đề tương tự. IEnumerable và năng suất được sử dụng bởi trình tạo mô hình viewmodel. Có ai biết chính xác điều gì gây ra vấn đề không? Điều này có mùi giống như một lỗi trong công cụ xem. –

Các vấn đề liên quan