我正在开发一个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" />
您可以访问所有级别的图像