.net mvc生成静态页面

 

目录

一、为什么要生成静态页面?

二、上代码

三、生成静态页面 

总结


一、为什么要生成静态页面?

起因是这样的,最近买了台云服务器,奈何囊中羞涩只买得起一核、两G内存、一兆宽带一年的服务器,当我用爬虫将爬取的数据做成网站发布到上面的时候,发现尴尬了,打开首页竟然要20秒,这..........,用户肯定受不了没打开就跑完了,而且加载首页的时候,CPU竟然直接爆到了90%

 

这可不能忍呀,所以想到将页面静态化以节省运算时间和效率。当我实现静态化后,页面首次加载的时间基本都在3秒之内,当第二次打开有了缓存之后基本都是在1秒左右,大家可以访问我的网站首页体验一下 免费电影下载_北辰影视

 这个网站所有资源都是用爬虫从互联网上爬取的,对爬虫感兴趣的同学可以参考我另一篇博文:.net爬虫使用HtmlAgilityPack爬取网络数据

二、上代码

创建生成静态页面的类和方法

 public class MVCStaticPage
    {
        #region 生成静态内容
        /// <summary>
        /// 生成静态内容
        /// </summary>
        /// <param name="context"></param>
        /// <param name="viewPath"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static string RenderViewToString(ControllerContext context,
                string viewPath,
                object model = null)
        {
            var paramPath = string.Empty;
            var newViewpath = string.Empty;
            if (viewPath.IndexOf("?")>=0)
            {
                paramPath=viewPath.Substring(viewPath.IndexOf("?"), viewPath.Length - viewPath.IndexOf("?"));
                viewPath = viewPath.Substring(0, viewPath.IndexOf("?"));
                var denghaoIndex = paramPath.IndexOf("=")+1;
                var paramPathLength = paramPath.Length;
                var jiequ = paramPathLength - denghaoIndex;
                context.Controller.TempData.Add(paramPath.Substring(denghaoIndex, jiequ)+"-"+DateTime.Now.ToLongTimeString(),0);
            }
             
            ViewEngineResult viewEngineResult =
            ViewEngines.Engines.FindView(context, viewPath, null);
            if (viewEngineResult == null)
                throw new FileNotFoundException("View" + viewPath + "cannot be found.");
           
            var view = viewEngineResult.View;
            context.Controller.ViewData.Model = model;
            //context.Controller.ViewData.Keys.
           
           
            using (var sw = new StringWriter())
            {
                var ctx = new ViewContext(context, view,
                                context.Controller.ViewData,
                                context.Controller.TempData,
                                sw); ;
                view.Render(ctx, sw);
                return sw.ToString();
            }
        }
        #endregion
    }

三、生成静态页面 

public ActionResult TestCreatStaticHtml()
        {
            //这里实例化当前的controler,为了拿到其他方法中的数据,也可以直接写sql拿到list集合数据放到循环中
            var testPageController = new TestPagedController();

            var tagStaticPage = string.Empty;

            List<string> list = new List<string>()
            {
                "电视剧",
                "美剧",
                "丧尸",
                "人性",
                "传记",
                "冒险",
                "剧情",
                "动作",
                "喜剧",
                "奇幻",
                "女权",
                "恐怖",
                "悬疑",
                "情色",
                "惊悚",
                "成长",
                "搞笑",
                "梦想",
                "武侠",
                "灵异",
                "烂片",
                "热血",
                "爱情",
                "科幻",
                "童话",
                "限制",
                "青春",
                "动画",
                "动漫"

            };
            for (int i = 0; i < list.Count; i++)
            {
                //这句不用管,是放到前端的类型展示
                ViewBag.Search = list[i];
                //下面就我要拿到Index方法中的数据,具体代码参考下一节
                testPageController.Index(list[i]);
                var tagPageList = testPageController.ViewBag.TagPageList;
                var tagHtml = MVCStaticPage.RenderViewToString(this.ControllerContext, "~/Views/TestPaged/Index.cshtml", tagPageList);
                //页面保存的路径
                tagStaticPage = HttpContext.Server.MapPath("~/testtag/");
                if (!Directory.Exists(tagStaticPage))
                {
                    Directory.CreateDirectory(tagStaticPage);
                }
                System.IO.File.WriteAllText(tagStaticPage + list[i] + ".html", tagHtml);
                System.IO.File.WriteAllText(tagStaticPage + System.Web.HttpUtility.UrlEncode(list[i]) + ".html", tagHtml);
            }
            Response.Write("<p>Tag已生成完毕</p>");
            Response.Flush();
            return View();
        }

 上面这句代码 testPageController.Index(list[i]),其实就是拿到下面代码的数据,这里只静态了电影类目的页面,大家可以把整站的数据拿来实例化

 public ActionResult Index(string id,string page="1")
        {
            string tag = id;


            if (string.IsNullOrEmpty(tag))
            {
                tag = "科幻";
            }
            ViewBag.Search = tag;
            var moviesDate = bllMovie.GetListByPageForMySqlId(" movie_tag like '%" + tag + "%' or by_03 like '%" + tag + "%' ", " oldid desc", -1, -1).Tables[0];
            var moviesDateConvertModels = bllMovie.DataTableToList(moviesDate).ToPagedList(int.Parse(page), 12);//new Common().DataSetBindList<Model.movies_tb>(movies, moviesDate);
            ViewBag.TagPageList = moviesDateConvertModels;

            return View(moviesDateConvertModels);
        }

总结

1.创建页面静态化,可以有效减少运算时间,节省服务器内存消耗。

2.使用MVC引擎自带的静态化可以很简单的实现静态化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET MVC框架提供了一种简单而强大的方式来创建登录和注册页面。以下是一个简单的示例代码: 在Controllers文件夹中创建一个名为AccountController的控制器,其中包含以下方法: ```csharp public class AccountController : Controller { // 注册页面 public ActionResult Register() { return View(); } [HttpPost] public ActionResult Register(RegisterViewModel model) { if (ModelState.IsValid) { // 在这里处理用户注册逻辑,例如将用户信息存储到数据库中 // 注册成功后,可以重定向到登录页面或其他页面 return RedirectToAction("Login"); } // 如果模型验证失败,返回注册页面并显示错误信息 return View(model); } // 登录页面 public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(LoginViewModel model) { if (ModelState.IsValid) { // 在这里处理用户登录逻辑,例如验证用户名和密码 // 登录成功后,可以重定向到用户的个人资料页面或其他页面 return RedirectToAction("Profile"); } // 如果模型验证失败,返回登录页面并显示错误信息 return View(model); } // 用户个人资料页面 public ActionResult Profile() { return View(); } } ``` 在Views文件夹中创建一个名为Account的文件夹,并在该文件夹下创建以下视图文件: 1. Register.cshtml ```html @model RegisterViewModel @using (Html.BeginForm("Register", "Account", FormMethod.Post)) { @Html.ValidationSummary() <div> @Html.LabelFor(m => m.Username) @Html.TextBoxFor(m => m.Username) @Html.ValidationMessageFor(m => m.Username) </div> <div> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password) </div> <input type="submit" value="Register" /> } ``` 2. Login.cshtml ```html @model LoginViewModel @using (Html.BeginForm("Login", "Account", FormMethod.Post)) { @Html.ValidationSummary() <div> @Html.LabelFor(m => m.Username) @Html.TextBoxFor(m => m.Username) @Html.ValidationMessageFor(m => m.Username) </div> <div> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password) </div> <input type="submit" value="Login" /> } ``` 3. Profile.cshtml ```html <h2>Welcome to your profile!</h2> ``` 上述代码中的`RegisterViewModel`和`LoginViewModel`是视图模型,用于封装注册和登录表单中的数据。 这只是一个简单的示例,你可以根据自己的需求来修改和扩展。同时,你还需要在全局.asax文件中配置路由规则,以便正确地处理请求。 希望这能帮到你!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值