将变量传递给@ Styles.Render函数

时间:2014-06-27 17:00:41

标签: asp.net-mvc razor

使用剃刀,可以使用以下方式呈现特定的样式表包:

@Styles.Render("~/Content/css")

这是指BundleConfig文件中包含以下行:

bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

...指向site.css文件夹内的Content文件。

我想设置一个变量(我已尝试过会话变量),如下所示:

Session["cssTheme"] = "~/Content/css";

所以我可以将它放在Styles.Render函数中,如下所示:

@Styles.Render(@Session["cssTheme"])

但它得到了无效参数的错误。

我想这样做,所以我可以更改会话变量值(到另一个样式包),这样就可以改变我的Web应用程序的css样式。

那么,如何将已编辑的变量传递到Styles.Render函数?

2 个答案:

答案 0 :(得分:0)

首先,Session是动态的,这意味着它可以容纳任何类型。当你提取一个值时,它在技术上属于object类型。 Styles.Render需要string类型的参数,因此您需要先将值转换为string

@Styles.Render(@Session["cssTheme"] as String)

然后,如果根本没有设置该会话变量,或者已将其设置为不能转换为字符串的字符串值以外的其他值,则可能会收到空值。因此,为了弥补这一点,您应该为空值提供一些后备:

@Styles.Render(@Session["cssTheme"] as String ?? "~/Content/css")

现在,它将使用会话变量中的任何内容,或“〜/ Content / css”作为最后的手段。但请记住,这仍然非常脆弱。如果将Session["cssTheme"]设置为字符串,但没有设置正确格式化的bundle引用,那么您仍然会收到错误,并且运行时出现错误,这很难看。理想情况下,您应该进行某种价值清理程序,在将Session["cssTheme"]传递给Styles.Render之前先运行{{1}}。

答案 1 :(得分:0)

假设你的模型是MyModel,它有字符串属性StyleSheet 所以你有你的观点

@model MyModel

@Styles.Render(model.StyleSheet) 

此外,您可以从Session中设置此属性,如下所示

public StyleSheet {
get {
    if(Session["cssTheme"]!=null)
     return Session["cssTheme"] as String 
     else 
       return   "defaultTheme";
}
set 
{
Session["cssTheme"]=value;
}
}