asp.net MVC 切换网站主题

首先要有一些定义后的CSS文件,本例是用Bootstrap作为前端框架,可以从http://bootswatch.com/网站上下载一些主题文件,也就是一些定义好的Bootstap.css的文件。

然后将这些文件放到网站中Content文件夹Themes 下,目录组织结构如图:

二、然后在网站根目录新建一个文件夹为Helper,在下面建立一个Bootstrap.cs文件。

public class Bootstrap
{
public const string BundleBase = "~/Content/css";

//类作为一个类的成员。
public class Theme
{
public const string Cerulean = "Cerulean";
public const string Darkly = "Darkly";
public const string Flatly = "Flatly";
public const string Spacelab = "Spacelab";
public const string Stock = "Stock";
public const string Superhero = "Superhero";
}

public static HashSet<string> Themes = new HashSet<string>
{
Theme.Cerulean,
Theme.Darkly,
Theme.Flatly,
Theme.Spacelab,
Theme.Stock,
Theme.Superhero
};

public static string Bundle(string themename)
{
return BundleBase + themename;
}
}
}

三、打开app-start文件夹下BundleConfig文件,修改如下:将每个主题都捆绑

foreach (var theme in Bootstrap.Themes)
{
var stylePath=string.Format("~/Content/Themes/{0}/bootstrap.css",theme);
bundles.Add(new StyleBundle(Bootstrap.Bundle(theme)).Include( //创建捆绑 ,"~/Content/css+themename"
stylePath,
"~/Content/site.css"));

四、要更改主题,可以把主题的名字字符串放在session 当中,也可以放在数据库中。都有缺点。session["ThemeName"]易丢失,跟客户端浏览器有关,如果存放在数据库中,可以与用户相关联。但我们这里的需求是通过后台更改前台的显示样式,所有可以把主题的名字字符串放在Application 或cache当中,这是应用程序全局共享的。

打开全局应用程序配置文件Global.asax.cs,

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

Application["CssTheme"] = Bootstrap.Theme.Stock; //增加应用程序状态集合。
}
}

五、更改布局页_Layout 。因为如果布局页引入了主题样式文件,更改了布局页,全站的样式都更改了。

@using MajorConstruction.Helpers;
@{
var theme = System.Web.HttpContext.Current.Application["CssTheme"] as string ?? Bootstrap.Theme.Stock; //当前请求上下文的应用程序状态。  //通过应用程序上下文对象的当前请求调用 Application对象。??为空值合并运算符,如果为空,就为默认的Stock 主题。
}

@Styles.Render(Bootstrap.Bundle(theme))
@Scripts.Render("~/bundles/modernizr")

六、更改主题了。定义一个ThemeContoller的控制器。get返回View,Post执行更改。

public class ThemeController : Controller
{
// GET: Admin/Theme
public ActionResult ChangeTheme()
{

return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ChangeTheme(string theme)
{
HttpContext.Application["CssTheme"] = theme;
return View();
}

七、定义 更改视图,显示出全部的主题,供选择。因为这个页面只需要提交一个主题名字字符串到控制器就可以了,所有我们使用了一个表单里面有一个隐藏字段,通过AJax的方式提交。

@using MajorConstruction.Helpers;

@{
ViewBag.Title = "更改主题";
}

<h2>@ViewBag.Title</h2>
<hr />
<div class="container">
<div class="row">
@foreach (var theme in Bootstrap.Themes)
{
<div class="col-md-3">
<div class="panel panel-default">  //使用Bootstrap的面板 ,不要标题。因为只是为了加一个边框,所以只使用了panel-body
<div class="panel-body">
<h2>@theme</h2>
<br />
<br />
<p>
@{
bool IsCurrent = theme == HttpContext.Current.Application["CssTheme"].ToString();   //判定当前遍历的主题是不是正在使用的,如果是正在使用的,更改按钮就变灰。把主题绑定在链接的上JavaScript函数
string btnDisabled = IsCurrent ? "disabled" : null;
}

//下面是一个按钮形式的链接,执行Javascript脚本 ,绑定主题名字值。主题名字必须加引号。不然,会提示 Uncaught ReferenceError: XX 未定义 is not defined.
<a class="btn btn-success @btnDisabled" href="javascript:SetActive(‘@theme‘)">应用主题</a> <!--把主题绑定在JavaScript函数上,通过调用Javascript函数提交隐藏表彰。-->
<!--还需要特别注意,调用 javascript 函数的参数@theme必须加引号,如果不加引号,总是谷哥浏览器总是提示 Uncaught ReferenceError: XX 未定义 is not defined,因为@theme变量本来就不是值类型,而是HashSet类型-->

以前就是没加引号,搞了半天,都提交不起,什么方法都试过了,还以为是服务端代码有问题。
</p>
</div>

</div>
</div>
}

</div>
</div>

@using (Html.BeginForm("ChangeTheme", "Theme", FormMethod.Post, new { id = "themeForm" }))
{
@Html.AntiForgeryToken()
<input type="hidden" name="theme" id="themeInput" />
}

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

<script type="text/javascript">
var changeThemeUrl = ‘@Url.Action("ChangeTheme")‘;

function SetActive(themename) {
$("#themeInput").val(themename); //将参数值传递给隐藏表单。

$("#themeForm").submit(); //提交表单,将 theme=themename 发送至控制器POST 方法中。

}

</script>

大功告成。

时间: 2024-08-10 19:01:42

asp.net MVC 切换网站主题的相关文章

ASP.NET MVC 3 网站优化总结(六)压缩 HTML

压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完成 html 的压缩. 其实我们在 ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩这篇文章中使用的就是这种方法,主要看看实现的 FilterAttribute 类: public class WhitespaceFilterAttribute : ActionFilterAtt

ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header

继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The following publicly cacheable, compressible resources should have a "Vary: Accept-Encoding" header. 相信很多人遇到过这个问题,它是什么意思呢?网上找到的资料为: 原来对CSS和JS文件开启Gz

ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 IE6 时不会发送 Accept-Encoding 请求头,这样就不支持 Gzip 压缩功能了,所以这里号召大家使用 Google Chrome.在 ASP.NET MVC 3 中我们通过实现 ActionFilter 来实现,如下: public class CompressAttribute :

ASP.NET MVC实现网站验证码功能

转:http://www.cnblogs.com/liuxiaoji/p/4920382.html 网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. 在ASP.NET网站中应用验证码是很容易的,网上有很多的解决方案.最近在做一个OA项目,因系统采用的ASP.NET MVC框架,同样在登录页中需用到验证码,故需将原来在ASP.NET网站中使用的验证码移

ASP.NET MVC - 发布网站

原文地址:http://www.w3school.com.cn/aspnet/mvc_publish.asp 学习如何在不使用 Visual Web Developer 的情况下发布 MVC 应用程序. 在不使用  Visual Web Developer 的情况下发布您的应用程序 通过在 WebMatrix.Visual Web Developer 或 Visual Studio 中使用发布命令,可以将 ASP.NET MVC 应用程序发布到远程服务器. 该功能会复制所有应用程序文件.控制器.

.net core Asp.net Mvc Ef 网站搭建 vs2017 1)

1)开发环境搭建 首先下载安装vs2017  地址 :https://www.visualstudio.com/zh-hans/downloads/ 安装勾选几项如下图 ,注意点在单个组件时.net core 运行时一定要勾上,很多人都没勾结果新增不了.net core 项目 2)开发 1.新增.net core mvc asp.net 2.新增Ef项目 首先通过nuget 安装三个依赖项 Install-Package Microsoft.EntityFrameworkCore.SqlServ

ASP.NET MVC部署网站到IIS,只列出网站目录

解决办法: 1.重启IIS 打开CMD运行以下代码: ps:根据发布网站的的.NET Framework版本进入对应的目录 4.0版本  C:\Windows\Microsoft.NET\Framework\v4.0.30319 3.5版本 C:\Windows\Microsoft.NET\Framework\v3.5 2.0版本 C:\Windows\Microsoft.NET\Framework\v2.0.50727 如图,以4.0版本为例: 重启IIS,如图: 输入命令 iisreset

asp.net mvc 获取网站的BasePath

public string BasePath { get { string ip_port = Request.Url.GetLeftPart(UriPartial.Authority); if (!string.IsNullOrWhiteSpace(ip_port) && ip_port.Contains("62.155.197.173")) { ip_port = "http://62.155.197.173:1888"; } string ba

总结一下ASP.NET MVC 网站的部署问题

总结一下ASP.NET MVC 网站的部署问题 近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到IIS上去? 现在我的系统是Windows 7,IIS也是7.0的版本,一开始部署的时候,还是按照.NET 2.0的方式部署,选择的是经典的模式,结果错误页面就出现了. 这张图是一开始按照原有的习惯部署.NET2.0的方式部署的,大家仔细看那个应用程序池,选择的是自己新建的,而且是经典模式 下面这张,就