3

此应用在 RouteConfig.cs 中配置了多个路由。例如,我定义了以下两条路线:

routes.MapRoute(
  name: "MyPage-Demo",
  url: "pages/page-title/demo",
  defaults: new { controller = "Root", action = "PageDemo" }
);

routes.MapRoute(
  name: "MyPage",
  url: "pages/page-title/{resource}",
  defaults: new { controller = "Root", action = "Page", resource = UrlParameter.Optional }
);

有人访问的每个页面都有一个指向“演示”的链接。一个页面可以通过访问来访问http://localhost/pages/page-title。这工作正常。

当用户单击“演示”链接时,他们将被重定向到位于 的页面http://localhost/pages/page-title/demo。这工作正常。

我的问题是演示页面可能引用了复杂的嵌套结构。该结构由 JavaScript、css、图像等组成。用于演示目的的内容。找不到这些嵌套资源。但是,我不确定如何设置路由以考虑这些嵌套文件。

我相信我需要更新控制器的PageDemo操作。但是,我不确定

a) 如何以允许不同结构的方式这样做,以及

b)如何更新我的路线配置以考虑这些嵌套结构。

有没有办法做到这一点?实际上,我将有多个页面和多个演示。出于这个原因,我想要一些比硬编码方法更可重用的东西。

4

7 回答 7

2

如果您只需要提供物理存储在路径中的文件,您应该可以忽略路由,例如:

routes.IgnoreRoute("pages/page-title/demo/resources/{*resource}");

这将绕过 MVC 尝试将请求路由到控制器。

或者你可以通过文件扩展名去:

routes.IgnoreRoute("{file}.js");
routes.IgnoreRoute("{file}.css");

(代码未经测试,但看起来你正试图在这里做类似的事情:) https://stackoverflow.com/a/3112192/486620

于 2013-08-27T02:06:54.963 回答
2

如果我理解:

问题似乎是您的MyPage-Demo路线:

routes.MapRoute(
  name: "MyPage-Demo",
  url: "pages/page-title/demo",
  defaults: new { controller = "Root", action = "PageDemo" }
); 

不是特定 {resource}的,而您的MyPage路线

如果你改变你的路线采取{resource}

routes.MapRoute(
  name: "MyPage-Demo",
  url: "pages/page-title/demo/{resource}",
  defaults: new { controller = "Root", 
        action = "PageDemo", resource = UrlParameter.Optional  });

那么你的动作方法可以

  1. 返回具有适当资源设置的特定视图
  2. 设置带有特定资源路径的 Viewbag 属性

如果这符合您的意图,则可以将这些路线合并为

routes.MapRoute(
  name: "MyPage-Demo",
  url: "pages/{action}/{resource}",
  defaults: new { controller = "Root", 
        action = "PageDemo", resource = UrlParameter.Optional  });
  1. /pages/PageDemo/{resource}解决Controller=pagesaction = PageDemo
  2. /pages/demo/{resource}解析为Controller=pages, action = demo.

此约定允许您灵活地创建更多 {resource}相关链接

于 2013-08-30T02:46:14.937 回答
1

浏览器中,右键单击演示页面 => 选择查看页面源

在这里,您的演示页面中有CSSJs文件的链接。单击那些 js/css 文件链接。检查是否有将您重定向到正确/预期的位置。否则,您可以相应地制作Css/Js文件URL因为,根据演示页面,每个 PageDemo 将具有自己独特的JS/Images/css结构等

于 2013-08-28T14:14:19.917 回答
0

MVC 看不到所有静态内容(.js、.css、.html、.png)(除非在 web.config 中将 modules/runAllManagedModulesForAllRequests 设置为 true)。静态内容扩展在 IIS 配置“模块映射”中定义,并且使用的是 StaticFileHandler 模块(而不是 .NET 模块)。

所以静态内容必须通过其相对于当前路径(当前html页面的路径)的物理路径来引用。

最好的解决方案是使用网站根目录的绝对链接。和 /content/demo1/demo1.html 一样,将所有 js、css 放在 /content/demo1/ 中,并在 demo1.html 中使用相对于 /content/demo1/ 文件夹(.html 所在的位置)的路径。即:与 demo1.css 在同一个文件夹中。

demo1.html 的链接是demo 1

于 2013-09-02T19:46:32.083 回答
0

也不是 100% 确定我是直接回答您的问题,而是假设您尝试访问的资源嵌套在反映页面结构的文件夹结构中 - 您遇到的问题是如何忽略这些的路由无需提前知道它们可能是什么?

这很好地解释了这一点:https ://stackoverflow.com/a/30551/1803682

我会问:

  1. 正如@PKKG 在他的回答中指出的那样——页面源代码中的链接是否符合您的预期?
  2. 如何为每个演示内容提供服务:例如通过服务而不是静态文件?
于 2013-08-30T20:40:53.600 回答
0

你是如何引用你的 JS 和 CSS 文件的?

如果您使用波浪号字符,例如 :~/Content/Styles/Site.css无论您在虚拟路径中的哪个位置,您都不会遇到任何问题。

于 2013-08-28T05:02:00.303 回答
0

这个答案包含两种方法。第二个可能更适合您的场景。第一个可能更适合一般的mvc项目

接近一

我建议在您的内容文件夹中创建一个有组织的结构来存储脚本和 css 文件,即

/Content/Demos/Page-Title-1/
/Content/Demos/Page-Title-2/
/Content/Demos/Page-Title-3/

/Content/Demos/Common/

然后制作一个包来为每个页面标题呈现脚本和 css 文件

IE。

bundles.Add(new StyleBundle("~/Demo/page-title/css").Include(
          "~/Content/Demos/Page-Title-1/csscontent1.css",
          "~/Content/Demos/Page-Title-1/csscontent2.css",
          "~/Content/Demos/Page-Title-1/csscontent3.css",
          "~/Content/Demos/Page-Title-1/csscontent4.css"));

bundles.Add(new StyleBundle("~/Demo/page-title/js").Include(
      "~/Content/Demos/Page-Title-1/jscontent1.css",
      "~/Content/Demos/Page-Title-1/jscontent2.css",
      "~/Content/Demos/Page-Title-1/jscontent3.css",
      "~/Content/Demos/Page-Title-1/jscontent4.css"));

这将允许您使用几行方法在演示页面上呈现脚本,即。

@Styles.Render("~/Demo/page-title/css");
@Scripts.Render("~/Demo/page-title/jss");

@Styles.Render("~/Demo/common/css");
@Scripts.Render("~/Demo/common/css");

当您更改 /Content/Demos/Page-Title/ 文件夹中的文件时,您必须更新全局 .asax 中的文件。这样做的好处是,如果您选择,您可以捆绑和缩小文件以节省带宽和加载第一页的时间。


接近二。

(还是使用下面的文件夹结构

/Content/Demos/Common/

/Content/Demos/Page-Title-1/
/Content/Demos/Page-Title-2/
/Content/Demos/Page-Title-3/)

制作一个 html 助手来引用文件夹中的所有脚本和内容

它的用法是@Asset.RenderAssets('~/folderdirectory')

助手会做类似的事情

@helper RenderAssets (stirng directory){

@* scrape the directory for all script files*
var scripts = find all scripts in the directory

@* include the script files *@
for each script
  <script src=" ... .js"></script>


@* scrape the directory for all cssfiles*
var styles = all css in the directory

@* include the css files *@
for each style
<link rel='stylesheet' type="text/css" href=" ... .css">

}

这将是每个演示视图中的几行用法

@Asset.RenderAssets( '~/Content/Demos/Common')
@Asset.RenderAssets( '~/Content/Demos/Page-Title')

您可能需要也可能不需要将它与 global.asax 或 RouteConfig.cs 文件中的额外几行或两行配对(参见源代码 3)

routes.IgnoreRoute("/Content/Demos/{page}/{script}.js");
routes.IgnoreRoute("/Content/Demos/{page}/{style}.css");

创建 html 帮助程序的相关来源参见 http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

要使用捆绑和缩小(scripts.render 方法),请参阅 http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

phill haakk 说可能不需要将其与忽略路线配对! https://stackoverflow.com/a/30551/1778606

鼓励评论和编辑。

于 2013-08-31T23:52:13.990 回答