2015-09-12 33 views
5

Ho il seguente percorso e deve essere in grado di gestire i titoli di gioco con qualsiasi carattere al loro interno. Ho abilitato le cose in modo appropriato nel mio web.config per consentire caratteri speciali nell'URL e ho confermato che i miei URL funzionano solo utilizzando le stringhe di query di base anziché i percorsi MVC personalizzati. Tuttavia, non appena includo un carico di azioni figlio tramite Html.Action ottengo la traccia dello stack sottostante.Parametri di routing MVC con caratteri speciali e azione figlio

routes.MapRoute("Game", "Game/Game/{id}", new { controller = "Game", action = "Game", id = ""}, new { id = @"[^\.]*" }); 

Ecco il mio metodo di controllo e visualizzazione (io li dumbed giù un sacco, ma l'errore si verifica ancora), esso viene chiamato per via, e anche il rasoio all'interno della vista stessa viene chiamata, ma poi ho ottenere il seguente errore/traccia dello stack.

Controller:

public ActionResult Game(string id) 
    { 
    { 
     Game currentGame = _ugdb.Games.FirstOrDefault(g => g.GameName.Equals(id)); 
     return View(currentGame); 

    } 

Vista:

@model UltimateGameDB.Domain.Entities.Game 
@Html.Action("SearchBar", "Search") 
<span>@Model.GameName</span> 

Bambino Azione Metodo Controller (non ottenere chiamato):

[ChildActionOnly] 
    public ActionResult SearchBar() 
    { 
    ViewBag.TotalGames = _ugdb.Game_Platform.Count() + _ugdb.Games.Count(g => g.Game_Platform.Count == 0); 
    return PartialView("_SearchBar"); 
    } 

Ecco alcuni esempi di alcuni itinerari che sono non funziona:

http://localhost:58386/Game/Game/Sid%20Meier%27s%20Civilization%3a%20Beyond%20Earth

http://localhost:58386/Game/Game/Starcraft%20II%3a%20Heart%20of%20the%20Swarm

Anche se in pratica qualsiasi gioco nel mio database che ha un carattere speciale sta dando lo stesso errore. Il messaggio di errore effettivo è la seguente:

System.NotSupportedException: The given path's format is not supported.

at System.Security.Util.StringExpressionSet.CanonicalizePath(String path, Boolean needFullPath) at System.Security.Util.StringExpressionSet.CreateListFromExpressions(String[] str, Boolean needFullPath) at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList) at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String path) at System.Web.InternalSecurityPermissions.PathDiscovery(String path) at System.Web.HttpRequest.MapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, Boolean allowCrossAppMapping) at System.Web.HttpRequest.MapPath(VirtualPath virtualPath) at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) at System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues) at System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, Object routeValues) at ASP._Page_Views_Game_Game_cshtml.Execute() in d:\TFS Workspace\UltimateGameDB\Dev\Source\ULTIMATEGAMEDB\UltimateGameDB.WebUI\Views\Game\Game.cshtml:line 257 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() at System.Web.WebPages.StartPage.RunPage() at System.Web.WebPages.StartPage.ExecutePageHierarchy() at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1 filters, ActionResult actionResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.b__1c() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__1e(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) at System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End() at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) at System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult, Controller controller) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End() at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult, ProcessRequestState innerState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End() at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) at System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)

Googled questo un gruppo e non riesco a capire perché questo percorso non avrebbe funzionato.

Grazie in anticipo!

+1

Avete bisogno del parametro dei vincoli? Hai provato a lasciare l'ultimo parametro spento? – drneel

+1

La definizione del percorso mi sembra soddisfacente. Puoi dare un esempio di url a cui non corrisponde? – Peter

+1

Si prega di fornire maggiori informazioni. Ho appena provato a creare l'app mvc di esempio e aggiungere il percorso. http: // localhost/game/game/gameid funziona bene per me. –

risposta

5

Provare a impostare relaxedUrlToFileSystemMapping="true" nell'elemento httpRuntime. Con gli attributi che hai già aggiunto, sarà probabilmente simile a questa:

<httpRuntime targetFramework="4.5" 
    requestPathInvalidCharacters="" 
    requestValidationMode="2.0" 
    relaxedUrlToFileSystemMapping="true" /> 

Dalla documentazione per la proprietà HttpRuntimeSection.RelaxedUrlToFileSystemMapping:

Gets or sets a value that indicates whether the URL in an HTTP request is required to be a valid Windows file path.

Da qualche parte nelle profondità del runtime di ASP.NET è prova a tradurre l'URL richiesto in un percorso fisico prima di gestire la richiesta. Questa impostazione sembra impedirgli di esplodere se il percorso fisico non è valido.

+0

Sei un vero toccasana, ho passato per sempre a cercare di capirlo, grazie mille, questo ha funzionato perfettamente! –