【问题标题】:Sending URLs/paths to ASP.NET MVC controller actions向 ASP.NET MVC 控制器操作发送 URL/路径
【发布时间】:2010-12-15 11:00:06
【问题描述】:

基于各种来源,显然不可能将这样的路径“/Content/Scripts/jquery.js”作为参数发送到 MVC 操作,因为正斜杠用作参数分隔符“/”和 ASP.NET MVC返回 400 错误。

到目前为止,我发现的唯一可行的解​​决方案是对此类字符串进行 Base64 编码,将其作为参数值发送并在控制器操作中对其进行解码。我像这样对 JS 文件的路径进行编码:

http://localhost/vdir/Services/GetJavaScript/=L3JzaDIwMTAvQ29udGVudC9XaWRnZXRGcmFtZXdvcmsvd2lkZ2V0Lmpz/=aHR0cDovL2xvY2FsaG9zdA==

我需要它,因为我使用返回 JavaScriptResult 的控制器操作将缩小和修改后的 JavaScript 注入页面,在这种情况下我不想使用 http 处理程序。

问题:这真的是 ASP.NET MVC 的唯一方法吗?因为它看起来不太友好,所以没有多少用户会去看页面源,但无论如何......;)

【问题讨论】:

    标签: asp.net-mvc model-view-controller


    【解决方案1】:

    通配符映射可让您将路径作为路由变量传递。见File path as MVC route argument

    【讨论】:

      【解决方案2】:

      您可以使用“老式”查询字符串方法:

      http://localhost/vdir/Services/GetJavaScript?script=/Content/Scripts/jquery.js

      让您的 GetJavaScript 方法接受一个名为 script 的字符串:

      public ActionResult GetJavaScript(string script)
      

      【讨论】:

      • 路由 URL 不能以 '/' 或 '~' 字符开头,并且不能包含 '?'字符。
      • 您的路由规则中一定有导致该错误的内容。在发布之前,我创建了一个快速而肮脏的 ASP.NET MVC 应用程序来测试它并且它有效。我只是使用了默认路由。你的路线是什么样的?
      • 事实证明这确实有效,而且它实际上是最干净的方式。只需确保您的操作参数的命名方式与 QueryString 参数相同。而且它们不必是 MVC 路线的一部分。例如: routes.MapRoute("GetJavaScriptService", RouteType.Regular, "Services/GetJavaScript", new { controller = "Services", action = "GetJavaScript"}, null);操作:public JavaScriptResult GetJavaScript(string jsPath) { ... } 请求:virtualdir/GetJavaScript?jsPath=URL_Encoded_JS_path 另一种对我有用的技术是将参数转换为 base64
      【解决方案3】:

      网址对其进行编码。它应该是这样的:

      http://localhost/vdir/Services/GetJavaScript/%2FContent%2FScripts%2Fjquery.js

      如果这不起作用,请将其放入查询字符串中:

      http://localhost/vdir/Services/GetJavaScript?js=%2FContent%2FScripts%2Fjquery.js

      HTH,
      查尔斯

      【讨论】:

        【解决方案4】:

        您不能将/ 替换为另一个字符,例如|?它仍然会使 URI 干净,但不会干扰路由。如果你所有的脚本都在同一个目录下,你可以默认它并从引用中删除路径,完全避免这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多