在ASP.NET MVC中,与Page.ResolveUrl相对应的是什么?

81

在ASP.NET MVC中,控制器中可用的Page.ResolveUrl相当于什么?

9个回答

120

这是Url.Content

ASPX:

<link rel="stylesheet" href="<%= Url.Content("~/Content/style.css") %>" type="text/css" />

Razor:

<link rel="stylesheet" href="@Url.Content("~/Content/style.css")" type="text/css" />

4
不要像我一样忽略了“~/”这一部分,因为它很重要。 - Slider345

43

这应该是你要寻找的方法...

System.Web.VirtualPathUtility.ToAbsolute("~/")
该方法可以将相对路径转换为绝对路径。

2
尽管我大多数时候使用Url.Content,但这种方法也很有用,因为它是静态的,不需要请求上下文,就像Url.Content一样。 - R. Schreurs
这可以用于被Web Forms和MVC同时使用的.ascx文件。 - kevinpo

11

这里有很多种解析使用应用程序根运算符(~的路径的方法。

要在asp.net页面上调用任何内联代码的方法,该方法需要作为当前对象的实例变量公开,或可用作静态/共享方法。
通过WebViewPage,典型的MVC页面使我们可以访问相当多的这些属性。您是否想知道当您键入@ViewData时,您会神奇地连接到ViewData?那是因为您已经访问了MVC页面提供的属性。
因此,要调用这些方法,我们不一定要引用它们所表示的类型,而是引用公开它们的实例属性。
我们可以像这样调用上述实例方法(依次):
href="@Url.Content("~/index.html")" 
href="@Server.MapPath("~/index.html")" 
href="@Href("~/index.html")" 

我们可以这样调用一个不需要实例的共享方法:
href="@VirtualPathUtility.ToAbsolute("~/index.html")"

据我所知,MVC页面不会自动创建System.Web.UI命名空间中的任何实例,其中包括ResolveUrl继承的内容。如果出于某种原因,您确实想使用该特定方法,则可以新建一个控件并使用其公开的方法,但我强烈不建议这样做
@Code
    Dim newControl As New System.Web.UI.Control
    Dim resolvedUrl = newControl.ResolveUrl("~/index.html")
End Code
href="@resolvedUrl" 

所有这些都说了,我建议使用@Url.Content,因为它最符合MVC范例。


3

0

在Razor v2.0/ASP.NET MVC 4中,你不再需要这样做了。

只需在Razor页面中使用"~",它会自动解析路径。

<link rel="stylesheet" href="~/Content/style.css" type="text/css" />

源代码


0

解决此问题的另一种方法:

在页面顶部或代码后台中的代码块中解析URL。

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
    Layout = "~/Pages/Shared/_IndexLayout.cshtml";
    String img1 = Url.Content("~/img/people11.jpg");
}

然后在html中使用变量。
<div class="col-12 col-lg-8" style="background-image: url('@img1');"> </div>

PS:这种方法还可以解决页面在多个嵌套引号中无法正确解析的问题。https://social.msdn.microsoft.com/Forums/en-US/35c09604-84eb-4539-8361-883376cfba85/problem-with-nested-single-and-double-quotes-in-embedded-code-blocks-in-the-markup?forum=aspwebforms - Michael W Ritchie

0
在我的情况下,我发现 @Href 在处理 URL 查询字符串时不够好用。我更喜欢将其包装在 Raw 方法中:
<script>
var isKendoWindow = false;
var myTimeOut;
clearTimeout(myTimeOut);
var sessionTimeout = (@Session.Timeout * 60000) - 5;
function doRedirect() {
    if (!isKendoWindow)
        window.location.href = '@Html.Raw(Href("~/Logon.aspx?brandid=" + SessionController.LandingBrandId + "&errCode=5055"))';
}
myTimeOut = setTimeout('doRedirect()', sessionTimeout);
</script> 

或者您可以像这样创建自己的版本:

 public static IHtmlString ResolveUrl(this HtmlHelper htmlHelper, string url)
 {    
     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
     return htmlHelper.Raw(urlHelper.Content(url));
 }

-5
Server.MapPath() //returna full path

或者

url.content()

Server.MapPath() 返回的是物理磁盘路径而不是像 Page.ResolveUrl("~") 那样展开完整的 URL,对吗? - Mark Redman
1
是的,你说得对,虽然可以绕过去,但是可以使用 url.content 代替! - Paul Creasey

-7
尝试使用 Server.MapPath()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接