加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – MVC Child Action在Path中抛出非法字符

发布时间:2020-12-16 03:50:04 所属栏目:asp.Net 来源:网络整理
导读:当我的视图包含子动作时,当我的url包含引号字符时,我收到一个意外的异常. http://mysite.info/home/index/” 当此操作的视图不包含子操作时,一切正常.如果它确实包含子操作(例如@ Html.Action(“Menu”)),则在调用Html.Action时会出现异常“System.ArgumentE
当我的视图包含子动作时,当我的url包含引号字符时,我收到一个意外的异常.

http://mysite.info/home/index/”

当此操作的视图不包含子操作时,一切正常.如果它确实包含子操作(例如@ Html.Action(“Menu”)),则在调用Html.Action时会出现异常“System.ArgumentException:path in Illegal characters”.

查看this post双引号字符不是默认的无效字符之一.在我看来,有或没有儿童行为的行为应该表现相同.双引号是有效还是不有效.

另外,我不确定如何最好地解决这个看似双重标准的问题.我犹豫是否要更改非法字符列表以包含“(默认值是默认值的原因).子操作非常有用所以我不想不使用它们.试着抓住每个孩子的动作是hacky .

我并没有积极尝试在我的路线中使用引号,但如果“不在非法字符列表中那么它不应该导致异常,对吧?

控制器:

public class HomeController : Controller
{
    public ActionResult WithChildAction() // throws exception with quote in path
    {
        return View();
    }

    public ActionResult WithoutChildAction() // works with quote in path
    {
        return View();
    }

    public ActionResult ChildAction()
    {
        return View();
    }
}

WithChildAction.cshtml:

<h2>With Child Action</h2>

@Html.Action("ChildAction")

WithoutChildAction.cshtml:

<h2>Without Child Action</h2>

ChildAction.cshtml:

<h2>Child Action</h2>

堆栈跟踪

[ArgumentException: Illegal characters in path.]
   System.IO.Path.CheckInvalidPathChars(String path,Boolean checkAdditional) +11113918
   System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str) +30
   System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access,AccessControlActions control,String[] pathListOrig,Boolean checkForDuplicates,Boolean needFullPath,Boolean copyPathList) +97
   System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access,String path) +63
   System.Web.InternalSecurityPermissions.PathDiscovery(String path) +29
   System.Web.HttpRequest.MapPath(VirtualPath virtualPath,VirtualPath baseVirtualDir,Boolean allowCrossAppMapping) +149
   System.Web.HttpRequest.MapPath(VirtualPath virtualPath) +33
   System.Web.HttpServerUtility.Execute(IHttpHandler handler,TextWriter writer,Boolean preserveForm,Boolean setPreviousPage) +44
   System.Web.HttpServerUtility.Execute(IHttpHandler handler,Boolean preserveForm) +28
   System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler,Boolean preserveForm) +19
   System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper,String actionName,String controllerName,RouteValueDictionary routeValues,TextWriter textWriter) +461
   System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper,RouteValueDictionary routeValues) +83
   System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper,Object routeValues) +29
   ASP._Page_Areas_Site_Views_Content_File_cshtml.Execute() in c:inetpubWebsitesMyWebsiteSourceAreasSiteViewsContentFile.cshtml:22
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +199
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,WebPageRenderingBase startPage) +78
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext,Object instance) +235
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext,TextWriter writer) +107
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult) +13
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext controllerContext,ActionResult actionResult) +56
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters,ActionResult actionResult) +420
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1 filters,ActionResult actionResult) +52
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +173
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult,ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult,Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult,ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9690164
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously) +155

解决方法

通过在web.config中设置以下内容找到一个可能的解决方案:

<httpRuntime relaxedUrlToFileSystemMapping="true"/>

这似乎很危险,所以我只是忽略错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读