我正在为ASP.NET WebForms/MVC开发一个运行时复合资源库.我通过WebControls支持标准的ASP.NET WebForms,并且最近还添加了对ASP MVC Html Helpers的支持.我目前支持WebForms WebControls的一个功能是"部分"资源定义的概念,其中资源可以通过主/视图页面等组合.
在实现MVC等价物时,我不确定最佳做法是什么?我目前倾向于设计类似于:
母版页
<% using (Html.CreateCompositeResourcePartContext())
{
Html.CompositeCssResourcePart(
"ResourceName",
new[] { "/Styles/SharedStyle1.css", "/Styles/SharedStyle2.css" }
);
%>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
<% } %>
Run Code Online (Sandbox Code Playgroud)
这将在头部ContentPlaceholder周围创建一个"上下文"包装器.
查看页面
<asp:Content ID="HeadContentPlaceholder" ContentPlaceHolderID="head" runat="server">
<% Html.CompositeCssResourcePart(
"ResourceName",
new[]
{
"/Styles/PageStyle5.css",
"/Styles/PageStyle6.css",
"/Styles/PageStyle7.css"
}) %>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
因此,任何视图页面都可以扩展部分资源定义,如上所示.
我有的问题:
1)与我的所有其他HtmlHelper不同,这些扩展不会立即写出HTML片段,而是等到处理上下文.这些扩展是否应该取决于ViewContext(或其他一些对象)?
2)我个人认为"使用"的概念有意义包装代码块而不是单独的BeginCompositeResourcePartContext/EndCompositeResourcePartContext调用,你同意吗?如果不是,单独的方法调用有什么好处?
任何有关上述内容的反馈将不胜感激.如果需要更多详细信息,请告知我们.
编辑
为了澄清......主页面头部内的块和视图页面中的后续引用将被合并到一个资源中.所以当处理CompositeResourcePartContext的上下文时,所有SIX文件只被合并到一个css文件中并写成单个链接TAG(或脚本,css sprite等)
<link rel="stylesheet" type="text/css" href="/MyMergedStyleSheet.css" />
Run Code Online (Sandbox Code Playgroud)
经过更多思考(并咨询同事)后,我觉得最好的选择是坚持我最初的计划,即不使用“部分”资源定义的概念污染我的 ASP.NET MVC API(适用于 WebControls,但不适用于 WebControls)在我看来,与 MVC 一样好)。在考虑在我的库中针对这种情况使用显式 HtmlHelper 扩展之前,我建议可以通过定义自定义扩展方法来处理该问题,如下所示:
public static class CustomXpediteExtensions
{
private static readonly IEnumerable<String> SharedCss = new[]
{
"/Styles/SharedStyle1.css",
"/Styles/SharedStyle2.css",
"/Styles/SharedStyle3.css"
};
public static MvcHtmlString CustomCompositeCssResource(this HtmlHelper htmlHelper, params String[] resources)
{
return htmlHelper.CompositeCssResource(SharedCss.Concat(resources));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图页面中简单地引用该自定义扩展(或常量等)。
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
<%= Html.CustomCompositeCssResource(
"/Styles/PageStyle5.css",
"/Styles/PageStyle6.css",
"/Styles/PageStyle7.css"
) %>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
这将使您在组合共享资源(即确保一致性)并最终处理该情况时不再重复自己。
我会将其保留一段时间,看看是否有任何反馈;但除非有充分的理由说明为什么这是不可接受的,否则我认为这就是答案。
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |