【问题标题】:How to specify path relative to current Master Page File如何指定相对于当前母版页文件的路径
【发布时间】:2011-12-05 16:27:55
【问题描述】:

我是 asp.net 的新手,但母版页似乎可以满足我的需求 - 允许我在运行时配置不同的模板/演示文稿/样式,因此我的应用程序可能会通过选择不同的母版页呈现不同的外观和感觉.每个母版页都位于其自己的文件夹中,其中包含一组为该“模板”量身定制的图像 - 然后我希望在内容页面中引用当前所选母版页文件夹中的各种图像,例如导航按钮数据页:

<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" 
    PageSize="25">
<Fields>
    <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="True" 
        ShowNextPageButton="False" 
        FirstPageImageUrl="<<Current Master Root>>/img/action-first.png" 
        PreviousPageImageUrl="<<Current Master Root>>/img/action-prev.png" />
    <asp:NumericPagerField ButtonCount="10" NextPageText="&gt;&gt;" 
        PreviousPageText="&lt;&lt;" />
    <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="True" 
        ShowPreviousPageButton="False" 
        LastPageImageUrl="<<Current Master Root>>/img/action-last.png"
        NextPageImageUrl="<<Current Master Root>>/img/action-next.png" />
</Fields>
</asp:DataPager>
TEST: "<%= System.IO.Path.GetDirectoryName(MasterPageFile) %>" 
(this does not work if we try to use it inside the DataPager?)

是否有适当的方法来执行此操作,例如使用 tilda ~ 字符访问应用程序根文件夹?在代码中设置它也被证明是乏味的,尤其是对于像 DataPager 这样的属性嵌套在子控件的动态列表中的东西(例如,我不知道如何设置属性 DataPager1.Fields[0].NextPreviousPagerField.FirstPageImageUrl in代码)。

我发现尝试使用主题执行此操作需要比我开始时更多的编码,因为我必须在皮肤文件中包含整个控件定义,而不仅仅是图像 url 属性,然后我必须在每个单一主题/皮肤。如果我碰巧想要一个具有不同按钮和/或数字字段配置的 DataPager,那么我还必须在每个皮肤文件中复制这些变化。如果我在以后进行更改,我将不得不记住在所有皮肤中也进行更改 - 严重违背了将代码与皮肤分离的目的。

我的应用程序运行多个项目,每个项目都可以选择自己的模板。对于整个应用程序,我想说:如果当前项目使用 TemplateX,则使用文件夹 /TemplateX/img/ 中的图像,如果选择了 TemplateY,则使用 /TemplateY/img/ 中的图像。如您所知,不能总是依赖 CSS 来确定在哪里使用什么图像,因此我们必须能够将图像引用直接放在 HTML 输出中。

在我开发的自定义 ISAPI DLL Web 系统中,我只是使用“[#HTML.Template]/img/prev.png”之类的替换字符串将模板文件夹粘贴在图像 URL 的前面。是否有一种方法可以挂钩自定义 .aspx 预处理器以手动替换所有出现的,如上面的示例中的“>”与当前选择的文件夹?

【问题讨论】:

  • 您可能想查看主题 - 请参阅 msdn.microsoft.com/en-us/library/ykzx33wh.aspx 您可以在运行时轻松切换主题。
  • 使用主题有点像,但不是一个很好的解决方案。我可以将 img 子文件夹放入 Theme 文件夹中,但我必须在 标记中包含所有内容,而不仅仅是图像 url 属性。这意味着我必须为每个主题(以及每种类型和控件的变体)复制所有这些代码,这有悖于目的。
  • 老实说,我认为你有一个相当不错的解决方案。我可能会将我的图像 url 写为“/{MASTER}/img/img.png”并使用 UrlRewriting 库来捕获此 URL 的路径并将令牌替换为当前母版页。这相当于您所拥有的,尽管您不需要自定义 ISAPI dll - 您只需将处理程序映射到您的 .Net 代码 (msdn.microsoft.com/en-us/library/ms972953.aspx)。另一种方法是从框架中派生您自己的自定义控件并更改其呈现方法以了解母版页 - 您拥有的解决方案要容易得多。
  • ISAPI dll 是一个使用 Delphi 编写的完全独立的 Web 系统。我正在尝试使用 Visual Studio/ASP.NET 重新实现该解决方案。这可能是一些心理障碍的根源,因为我对我在该系统中如何做事有先入之见,这对我来说似乎很明显,但在 asp.net 中似乎非常复杂。我会看看 UrlRewriting 但我有点怀疑 - 例如,url 处理程序如何知道用于构造 url 的母版页,或者我们是否必须将母版页添加到 url (...然后导致与原始问题相同的问题)
  • 您应该能够在处理程序中看到当前的 HTTPContext。根据您在请求生命周期中的位置,您可以获得所请求页面的句柄,这意味着您应该能够计算出当前的母版页。您当然可以找到用户,因此如果您想将其存储为当前用户的用户设置(通过任一会话、数据库查询等),您也可以检查用户当前的母版页属性是什么.

标签: asp.net directory master-pages


【解决方案1】:

尝试使用这样的东西

var path = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpContext.Current.Request.ApplicationPath;

【讨论】:

  • 您的代码不包括当前的母版页。为此,我可以使用“System.IO.Path.GetDirectoryName(MasterPageFile)”,但如前所述,似乎没有方便的方法在 DataPager 中以声明方式使用它。
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多