Em minhas aplicações, geralmente preciso usar caminhos relativos. Por exemplo, quando faço referência a JQuery, geralmente faço assim:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Agora que estou fazendo a transição para MVC, preciso levar em consideração os diferentes caminhos que uma página pode ter em relação à raiz. É claro que isso era um problema com a regravação de URL no passado, mas consegui contornar isso usando caminhos consistentes.
Estou ciente de que a solução padrão é usar caminhos absolutos, como:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
mas isso não funcionará para mim, pois durante o ciclo de desenvolvimento, tenho que implantar em uma máquina de teste na qual o aplicativo será executado em um diretório virtual. Os caminhos relativos à raiz não funcionam quando a raiz muda. Além disso, por motivos de manutenção, não posso simplesmente alterar todos os caminhos durante a implantação do teste - isso já seria um pesadelo.
Qual é a melhor solução?
Editar:
Uma vez que esta questão ainda está recebendo visualizações e respostas, achei que seria prudente atualizá-la para observar que, a partir do Razor V2, o suporte para urls relativos à raiz está integrado, para que você possa usar
<img src="~/Content/MyImage.jpg">
sem qualquer sintaxe do lado do servidor, e o mecanismo de visualização substitui automaticamente ~ / por qualquer que seja a raiz do site atual.
fonte
Embora seja uma postagem antiga, os novos leitores devem saber que o Razor 2 e posterior (padrão no MVC4 +) resolve completamente este problema.
MVC3 antigo com Razor 1:
Novo MVC4 com Razor 2 e posterior:
Nenhuma sintaxe estranha do tipo função do Razor. Sem tags de marcação não padrão.
Prefixar um caminho em qualquer atributo HTML com um til ('~') diz ao Razor 2 para "apenas fazer funcionar" substituindo o caminho correto. É ótimo.
fonte
Mudança decisiva - MVC 5
Fique atento a uma mudança significativa no MVC 5 (das notas de lançamento do MVC 5 )
Eles não explicam realmente como fazer isso, mas então eu encontrei esta resposta :
Nota: Você pode querer verificar primeiro
Request.ServerVariables
realmente contémIIS_WasUrlRewritten
para ter certeza de que este é o seu problema.PS. Achei que estava acontecendo uma situação em que isso estava acontecendo comigo e estava obtendo
src="~/content/..."
URLs gerados em meu HTML - mas aconteceu que algo simplesmente não estava atualizando quando meu código estava sendo compilado. Editar e salvar novamente o Layout e os arquivos cshtml da página de alguma forma fez com que algo funcionasse.fonte
Geralmente uso ASP.NET
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Não vejo por que uma solução semelhante não deve funcionar na ASP.NET MVC.fonte
É o que eu usei. Mude o caminho para corresponder ao seu exemplo.
fonte
Pelo que vale a pena, eu realmente odeio a ideia de encher meu aplicativo com tags de servidor apenas para resolver caminhos, então eu fiz um pouco mais de pesquisa e optei por usar algo que eu tentei antes para reescrever links - um filtro de resposta. Dessa forma, posso prefixar todos os caminhos absolutos com um prefixo conhecido e substituí-lo em tempo de execução usando o objeto Response.Filter e não precisar me preocupar com tags de servidor desnecessárias. O código está postado abaixo para o caso de ajudar mais alguém.
fonte
O mecanismo de visualização Razor para MVC 3 torna ainda mais fácil e limpo o uso de caminhos relativos de raiz virtual que são resolvidos corretamente em tempo de execução. Basta soltar o método Url.Content () no valor do atributo href e ele será resolvido corretamente.
fonte
Como Chris, eu realmente não suporto ter que colocar tags inchadas do lado do servidor dentro da minha marcação limpa apenas para dizer a essa coisa estúpida para olhar da raiz para cima. Isso deve ser algo muito simples e razoável de se pedir. Mas também odeio a ideia de ter que me esforçar para escrever qualquer classe C # customizada para fazer uma coisa tão simples, por que deveria? Que perda de tempo.
Para mim, simplesmente comprometi a "perfeição" e codifiquei o nome do caminho raiz do diretório virtual dentro das minhas referências de caminho. Assim:
Nenhum processamento do lado do servidor ou código C # necessário para resolver a URL, o que é melhor para o desempenho, embora eu saiba que seria insignificante de qualquer maneira. E nenhum caos feio do lado do servidor inchado na minha marcação limpa agradável.
Vou ter que viver sabendo que isso está codificado e precisará ser removido quando a coisa migrar para um domínio adequado em vez de http: // MyDevServer / MyProject /
Felicidades
fonte
Atrasado para o jogo, mas este post tem um resumo muito completo sobre como lidar com caminhos ASP.Net.
fonte
Eu uso um método auxiliar simples. Você pode usá-lo facilmente nas Visualizações e Controladores.
Markup:
Método auxiliar:
fonte
Eu optei por uma abordagem um pouco diferente com base em um post SO semelhante, mas com muito menos código ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
fonte