代码之家  ›  专栏  ›  技术社区  ›  Pretzel

无法在站点中正确引用CSS。在虚拟目录中具有MVC2的master

  •  4
  • Pretzel  · 技术社区  · 16 年前

    目前,我有一个 Site.Master 我的MVC应用程序的页面,当直接从VS2008运行时,它会呈现出很好的效果。看起来是这样的:

    <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="content-type" content="text/html; charset=utf-8" />
      <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_setup.css" />
      <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_text.css" />
      <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>  
    </head>
    

    不幸的是,当在“虚拟目录”中的IIS6.0服务器上使用时,CSS引用无法加载,页面无法正确呈现。(虚拟目录是指 http://localhost/MyTestSite 其中“mytestsite”是在安装MVC应用程序的服务器上的IIS管理器中创建的虚拟目录。)

    MVC应用程序运行良好,从中生成的HTML正常加载,但服务器似乎找不到引用的CSS和相关图像的位置。我觉得这让人困惑,因为从VS2008运行时,它似乎工作得很好。

    我 做 找到解决我问题的方法,但我对结果并不完全满意:

    <link rel="stylesheet" type="text/css" href=<%= Page.ResolveUrl(@"~/Content/css/layout1_setup.css") %> />
    <link rel="stylesheet" type="text/css" href=<%= Page.ResolveUrl(@"~/Content/css/layout1_text.css") %> />
    

    使用 Page.ResolveUrl() 在VS2008中编辑时,它破坏了页面的拆分和/或设计视图的呈现,我觉得这是一个黑客。(所有CSS标签都以绿色下划线表示“不存在”。)也就是说,当“运行”时,它在IIS6和VS2008中都表现得很好。

    有没有更好的方法来解决这个问题?

    编辑: 我的问题听起来像这里描述的问题: http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx --但是我已经有了 default.aspx.cs 文件实现如下所示。

       public void Page_Load(object sender, System.EventArgs e)
       {
            string originalPath = Request.Path;
            HttpContext.Current.RewritePath(Request.ApplicationPath, false);
     // Setting "false" on the above line is supposed to fix my issue, but it doesn't.
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(HttpContext.Current);
            HttpContext.Current.RewritePath(originalPath, false);
       }
    
    5 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    约翰哈托克 正在进行中 something 但是,他尝试执行的预处理器命令在设计模式下无法按预期工作(我认为它实际上尝试同时执行这两个操作)。您可以尝试使用.NET进行检查 Site 在设计模式下运行或不运行时可用于测试的属性(在版本配置中, 现场 属性并不总是被填充的,因此您还必须检查它是否不为空)。

    另外,Visual Studio Design Viewer不知道域和虚拟应用程序路径,因此在设计器中可以使用 / 指向应用程序根目录。

    <% if (Site != null && Site.DesignMode) { %>
     <link href="/Content/css/layout1_setup.css" rel="stylesheet"/>
    <% } else { %>
     <link href="<%= Url.Content("~/Content/css/layout1_setup.css") %>" rel="stylesheet"/>
    <% } %>
    
        2
  •  3
  •   John Hartsock    16 年前
    <link href="<%= Url.Content("~/Content/css/mystyle.css") %>"
            rel="stylesheet" type="text/css" />
    

    编辑:

    在考虑了这一点之后,我重新认识到,在使用vs 2008时,在“ASP.NET开发服务器”下运行网站时,您可能使用调试模式,在部署到IIS时,您可能已经在发布模式下发布了代码。

    如果是这种情况,您可以尝试以下操作:

    <% #if DEBUG %>
       <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_setup.css" />
       <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_text.css" />
     <% #else %>
       <link rel="stylesheet" type="text/css" href="<%= Url.Content("~/Content/css/layout1_setup.css") %>" />
       <link rel="stylesheet" type="text/css" href="<%= Url.Content("~/Content/css/layout1_text.css") %>" />
     <% #endif %>
    

    现在,当您在Visual Studio 2008中运行时,您的CSS代码完成工具可以工作,也可以在虚拟目录中运行您的网站(作为发布版本)。

        3
  •  1
  •   Darin Dimitrov    16 年前

    恐怕没有 优雅的 这样做的方式。您可以执行以下可怕的黑客操作来欺骗设计师:

    <% if (false) { %>
    <!-- That's just to cheat the designer, it will never render at runtime -->
    <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_setup.css" />
    <link rel="stylesheet" type="text/css" href="../../Content/css/layout1_text.css" />
    <% } %>
    <link rel="stylesheet" type="text/css" href="<%= Url.Content("~/Content/css/layout1_setup.css") %>" />
    <link rel="stylesheet" type="text/css" href="<%= Url.Content("~/Content/css/layout1_text.css") %>" />
    

    就我个人而言,我从不使用设计器,也不会在我的代码中这样做,但是如果您真的需要这个设计视图,那么它可能是一个解决方案。

    我的意思是,您正在一个ASP.NET MVC项目中工作,您应该操纵HTML,为什么要关心设计视图?看看为了让设计视图正常工作你应该付出的代价,它太贵了。打得更快 CTRL+F5 在您最喜欢的浏览器中查看您的工作结果,而不是一直在代码和设计视图之间切换。

        4
  •  1
  •   Richard Marskell - Drackir Sunil Tandon    16 年前

    也许这很明显,或者我错过了什么,但这看起来像是一个路径问题。您正在使用相对路径( ../../ )我相信在Visual Studio中运行某个程序时,应用程序就是根路径(即 default.aspx 在项目的主目录中 localhost:port/default.aspx )如果任何页面中的相对路径向上移动的目录太多(即 ../ 太多次),它将被忽略并从网站的根目录(在本例中 localhost:port/ )例如,如果文件夹结构如下:

    • 近似
      • 样式(文件夹)
      • 内容(文件夹)
      • 其他文件(文件夹)
        • 阿姆克斯
      • 阿斯克斯

    您可以访问 content 文件夹从 myfile.aspx 通过使用 ../content/ 或者,即使你不应该这样做,用 ../../content/ 只有当approt与域根目录(即 localhost:port/content/ 和 domain.com/content/ 是同一个文件夹)。
    但是,如果您将这些文件放在Web服务器上的另一个(虚拟)文件夹中(即。 domain.com/virtual =新批准)现在 ../../content 从 domain.com/virtual/otherfiles/myfile.aspx 将引用 域.com/content/ ,这是不正确的。

    我希望这有帮助。

        5
  •  0
  •   Chris Curtis    16 年前

    刚刚测试了以下内容,以确保它可以解决两个问题(启用设计视图并正确解决)。希望对你有用

    <link rel="stylesheet" type="text/css" href="~/Content/css/layout1_setup.css" runat="server" />
    <link rel="stylesheet" type="text/css" href="~/Content/css/layout1_text.css" runat="server" />