ASP.NET MVC - 每次处理Site.Master时执行代码

时间:2009-02-09 17:51:10

标签: asp.net-mvc

每次处理Site.Master视图时,我都想在我的css链接的路径上添加一些变量。这样做的正确方法是什么?我的代码目前打破了Default.aspx,说我还没有定义cssLink。 Site.Master代码如下:

    <script runat="server">
        void Page_Load(object sender, EventArgs e)
        {

            string cssLoc = "../../Content/css/expect.css?t=" + DateTime.Now.Ticks.ToString();
            string cssLink = String.Format(@"<link rel=""stylesheet"" type=""text/css"" href=""{0}"" />", cssLoc);
        }
    </script>

    <!DOCTYPE html>
    <html>
    <head id="Head1" runat="server">   
        <asp:ContentPlaceHolder ID="head" runat="server">
        <title></title>
        </asp:ContentPlaceHolder>    
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <%= cssLink %>
        <script type="text/javascript" src="../../Scripts/jquery.js"></script>
    </head>

另外,无论如何要解决“XHTML过渡,标题发生次数太少”的消息吗?

更新
请忽略范围问题。见理查德的回答。但我应该注意到,解决这个问题并不能解决问题 我认为因为Inherits =“System.Web.Mvc.ViewMasterPage”声明了整个 <{1}}阻止无法处理。

4 个答案:

答案 0 :(得分:5)

只需像您通常那样定义您的css链接并添加一些内联处理。您正试图在MVC视图中执行Page_Load,这不是一个可行的解决方案...

<link href="../../Content/css/expect.css?t=<%=DateTime.Now()%>" type="text/css" rel="Stylesheet" />

答案 1 :(得分:2)

您已在Page_Load中将cssLink声明为本地变量。因此,它将不适用于您的页面。

这应该可以解决您的问题:

<script runat="server">
    private string cssLoc;
    private string cssLink;

    void Page_Load(object sender, EventArgs e)
    {

        cssLoc = "../../Content/css/expect.css?t=" + DateTime.Now.Ticks.ToString();
        cssLink = String.Format(@"<link rel=""stylesheet"" type=""text/css"" href=""{0}"" />", cssLoc);
    }
</script>

<!DOCTYPE html>
<html>
<head id="Head1" runat="server">   
    <asp:ContentPlaceHolder ID="head" runat="server">
    <title></title>
    </asp:ContentPlaceHolder>    
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <%= cssLink %>
    <script type="text/javascript" src="../../Scripts/jquery.js"></script>
</head>

编辑:除了回答您的直接问题之外,我还建议您找一个更适合MVC的解决方案(而不是将代码放在您的母版页中)。例如,你可以将css位置包含为ViewData [“样式表”]或使用不同的机制来更新css(我在MVC的RC上不是最新的)

答案 2 :(得分:2)

<head runat="server">
      <title>Some Title</title> -- WILL FIX YOUR ISSUE
      ...
      <%= Helper.CustomStyle() %>
      ...
</head>

这个Helper.CustomStyle的内部逻辑会根据如上所示的DateTime.Now调用而变化。

可以在此处找到一个非常好的教程,帮助您了解自定义助手:http://www.asp.net/learn/mvc/tutorial-09-cs.aspx

请记住 - ASP.NET MVC取消了Page_Load类型的调用。这是一种独特的设计模式!

答案 3 :(得分:2)

考虑编写一个帮助程序来链接该CSS文件。

public static string DatedStylesheet(this HtmlHelper Html, string url, DateTime date)
{
    UrlHelper Url = new UrlHelper(new RequestContext(Html.ViewContext.HttpContext, Html.ViewContext.RouteData));
    string html = "<link type=\"text/css\" rel=\"stylesheet\" href=\"{0}?t={1}\"/>";

    return string.Format(html, Url.Content(url), date.Ticks.ToString());
}

<%= Html.DatedStylesheet("~/Content/css/expect.css", DateTime.Now);

在一个不相关的说明中,有没有人知道在视图页面之外使用UrlHelper的更简洁方法?