2016-09-14 12 views
0

で相対URLを取得します。私は相対パス持っているMVC 4

~/Content/themes/base/jquery-ui.min.css" 

を、私は隠された入力がありますMVCで

<input type="hidden" id="siteUrl" value=""/> 

を私は隠しフィールドに、完全修飾URLを保存したいです。私が試してみました:

<input type="hidden" id="siteUrl" value="@Url.RequestContext.HttpContext.Request.MapPath("~/Content/themes/base/jquery-ui.min.css")"/> 

<input type="hidden" id="siteUrl" value="@HttpContext.Current.Request.MapPath("~/Content/themes/base/jquery-ui.min.css")"/> 

しかし、両方の物理パスを返すされたものを、私はURLが必要です。私もUriBuilderを使ってみましたが、私のlocalhost上で動作するかもしれませんが、私のIISサーバに公開していないので、これは私のためには機能しません。

<input type="hidden" id="siteUrl" value="@Url.Content("~/Content/themes/base/jquery-ui.min.css")"/> 

をそれは私が試した私のMVCコントローラに

/Content/themes/base/jquery-ui.min.cssを返します:

は私も試してみましたまた、私は必要なものを行いません

Page.ResolveClientUrl("~/Content/themes/base/jquery-ui.min.css"); 

背景:私は、相対URLを使用するときにJSで、それはそれぞれのためにMVCでそれを正しく使用する方法を知っているdoesntの、

は、私は隠しフィールドにそのFQ URLを保存してから、私はJSでそれにアクセスパスの変更をリンクし、それだけでこのような終わりまでに相対的な文字列を鋲: http://localhost/~/Content/themes/base/jquery-ui.css

私はちょうどそれがhttp://localhost/Content/themes/base/jquery-ui.cssの作品~/削除しませんが、私は新しいリンクに行くためにクリックすると、パスはもうある場合良い:http://localhost/newLink/Content/themes/base/jquery-ui.css

私のlocalhostのURLはhttp://localhost/Content/themes/base/jquery-ui.css であり、私のサーバーのhttp://server/productName/Content/themes/base/jquery-ui.cssは基本サーバーのURLが将来変更される場合に備えて静的な名前をコードしたくありません。

したがって、相対パスの完全修飾URLを取得するにはどうすればよいですか。

+0

@RoryMcCrossanは 'Server.MapPath'はちょうど私が'のhttpすなわち、完全修飾URLを必要とし、物理パスを返します。 com/productName/Content/...' – Blindsyde

+0

あなたのアプリケーションはprductionで" webapplication "としてデプロイされますが、開発サーバーでは"ウェブサイト "として実行されます(これらはIIS用語です)。違いは、仮想パスSystem.Web.HttpRuntime.AppDomainAppVirtualPath(この場合は "productName")です。 @ Url.Content( "〜/ Content/themes/base/jquery-ui.min.css")を使用すると、必要なときに仮想パス**のみが含まれているので、必要なものにすることができます。 IIS ExpressとローカルIISの両方を展開しようとしなかったので間違っていると思います。ローカルIISにデプロイすると、アプリケーション名が格納されます。 – derloopkat

答えて

2

私はあなたがUriBuilderで持った発行かわからないんだけど、それが最善の方法だ:

@{ 
    var uriBuilder = new UriBuilder(Request.Url); 
    uriBuilder.Path = Url.Content("~/Content/themes/base/jquery-ui.min.css"); 
} 
<input type="hidden" id="siteUrl" value="@uriBuilder.ToString()"/> 

あなたはRequest.Urlで始まるので、あなたは、ハードコードにホストを持っていません。そうすれば、どこにでも展開できます。その後、Pathを変更しますが、を最初に置き換えるには、Url.Contentを使用する必要があります。あなたが実際にも、独自のUrlHelper拡張機能を追加したい場合があります

://ドメイン:

public static class UrlHelperExtensions 
{ 
    public static string AbsoluteContent(this UrlHelper helper, string contentPath) 
    { 
     return new Uri(helper.RequestContext.HttpContext.Request.Url, helper.Content(contentPath)).ToString(); 
    } 
} 
+0

恐ろしい!これはうまくいきました、本当にありがとう、私は大げさになりました。私が遭遇した問題は、 'Request.Url.AbsolutePath' – Blindsyde