Tilde Slash Paths Not Working in MVC 4

試著忘記壹切 提交于 2019-12-19 05:46:49

问题


As I understand it, a plain ol' "~/foo" path is supposed to work like @Url.Content("~/") in MVC 4. However, I'm trying to do this and getting many broken paths -- the tilde is still there when the HTML is output.

So, for example, I have this path in /Views/Shared/_Layout.cshtml:

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

And the HTML delivered looks like this:

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

I'm pretty sure I have this running as an MVC 4 project, too. The following stuff's in the web.config:

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

...and at this point, I'm not sure what to look for next. Any suggestions?


回答1:


This could be as a result of a bug in Razor V2, where an apostrophe / single quote in an HTML comment breaks resolution of ~ paths.

The workaround is to use Razor comments instead of HTML comments. I.e., replace <!-- Here's your comment--> with @* Here's your comment *@.

Sorry this is a long shot, as I've no idea if you have HTML comments, let alone ones containing single quotes.




回答2:


My guess is that you are still running Razor 1 (MvcWebRazorHostFactory is < 4.0).

Verify the web.config in your Views folder looks like this...

 <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>



回答3:


I had this problem when I cut and paste some example code into a view. Turned out I had the wrong type of tilde!

@{
Layout = "∼/Views/_BasicLayout.cshtml";
}

vs

@{
Layout = "~/Views/_BasicLayout.cshtml";
}

Subtly different - sod to find




回答4:


Reinstalling MVC 4 (RC) using the standalone installer here solved this problem for me. I still don't understand what caused the problem, but I can live with that.




回答5:


For me the problem was only related to SVG image types. Solved it by adding the following to the project's web.config file (not the web.config used by the views, MVC4).

<configuration>
   <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      </staticContent>
   </system.webServer>
</configuration>



回答6:


The issue is about href= and not which < tag >
Examples:

< img src="@Url.Content("Images/someImage.jpg")"/>
< a href="@Url.Content("Home/About")" >click here< /a>

Its ok to nest @ inside other @section {}




回答7:


What solved this for me was turning off Meleze.web HTML Minification.




回答8:


For MVC 5 and Razor 3, the problem for me turned out to be an extra quote character in an html element that came before (long before!) the img tag:

<div class="foo""> <!-- note the extra quote character here ugh -->
...
</div>
...
<img src="~/images/an-image.png" />

The above problem caused razor to ignore the tilde (~), giving it to the browser as-is / not transformed. Took me forever to find the problem, which I eventually found by moving the img tag to the top of the file and discovering it worked fine there, and then doing a divide-and-conquer approach to narrow down the spot in the *.cshtml file where it stopped working.

I hope this post saves someone some time!



来源:https://stackoverflow.com/questions/10853316/tilde-slash-paths-not-working-in-mvc-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!