ASP.NET自定义路由中断图像和javascript



我正在开发一个ASP.NET MVC 3应用程序,它在使用默认路由时运行良好。因此,我有类似的url,localhost:4457/Users/Details/5
我想在url中添加一个友好的段塞,使其成为本地主机:4457/Users/Details/5/someones-name
所以我添加了一条自定义路线,我的路线现在看起来像

routes.MapRoute(
     "withslug",
     "{controller}/{action}/{id}/{slug}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional, slug = UrlParameter.Optional });
 routes.MapRoute(
     "Default",
     "{controller}/{action}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

在视图中,我有一个类似的动作链接

@Html.ActionLink(Model.Name,"Details","Users", new { id=Model.ID, slug="some-ones-name"},null)

我也有这样的图片链接

<img src="../../Content/images/picture.jpg" alt="" height="42" width="37" />

链接工作正常,当我点击它时,它会正确显示。地址为localhost:4457/Users/Details/5/someones-name。问题是页面上的所有图像现在都坏了,我的javascript函数无法运行
如果我从地址中删除slug,并将url保留为localhost:4457/Users/Details/5,那么一切都会按预期进行。

如果我在id后面加上一个斜杠,所有的东西都会再次中断。内容加载如预期,只是图像和一些javascript函数。

我不明白问题出在哪里,任何见解都将不胜感激。

段塞被视为一个目录。当url包含slug时,您需要向图像路径添加一个额外的../才能使其工作。你真的应该避免在你的网站上使用这样的相对路径。

如何修复它,使其适用于每一页

您可以将其更改为使用相对于站点根的路径,如下所示:

<img src="/Content/images/picture.jpg" alt="" height="42" width="37" />

或者,您可以使用asp.net mvc提供的helper方法,它的工作原理是这样的。此方法将自动神奇地转换相对于当前url的路径。

<img src="@Url.Content("~/Content/images/picture.jpg")" ... />

这将适用于<script><link>标记以及引用url的任何其他标记。

注意:我使用的是上面的Razor语法,如果您使用的是web表单视图引擎,代码会是这样的。

<img src="<%: Url.Content("~/Content/images/picture.jpg") %>" ... />

附加说明,在使用剃须刀几个月后,我刚写了<% %>标签,感觉很脏

只对图像和JavaScript使用绝对路径可能最简单,例如

<img src="/Content/images/picture.jpg" alt="" />

这样,如果你需要再次修改你的URL路由,你就不必担心再次破坏图像、CSS或JavaScript的任何相对路径。

ResolveClientUrl方法可能对生成绝对路径有用:

<img src="<%= ResolveClientUrl("~/Content/images/picture.jpg") %>" alt="" />

尽可能不要使用相对路径。使用这个替代:

<img src="<%= Url.Content("~/Content/images/picture.jpg")%>" alt="" />

我还不是路由专家,但我想知道你的问题是否是有两个相邻的可选元素。路由引擎如何区分缺少{id}的路由和缺少{slug}的路由?把路线改成{controller}/{action}/{id}-{slug}怎么样?

只需尝试使用:

<img src="../../../images/logo.png" />

您可以访问所有级别的图像

最新更新