asp.net mvc 2.0+Silverlight播放器开发的TeamVideo视频播放网站--系列2

news/2024/5/20 0:50:49/文章来源:https://blog.csdn.net/weixin_33698043/article/details/86036458

这几天抽空写第二部分。很高兴今天能够和大家分享下。我这是个asp.net mvc的新手。。。希望各位提出宝贵的意见。

你可以在这里查看第一部分的内容。http://www.cnblogs.com/n-pei/archive/2010/08/30/1812981.html

  

按照之前计划,这一部分的内容如下:

1. 对电影的打分功能实现

2. 评论的功能实现和对输入的评论内容的验证

3. 电影列表的展示和分页功能

4. 电影详细内容显示

  

在说明功能实现的同时会和大家分享思路。

  

1。打分功能的实现(Rating):

这个功能不管怎么说都得使用AJAX方法实现,不然当某个人看电影看到鸡动处给打了5分,结果页面刷新了就杯具了。

因为打分部分好几个页面都会用到它,或者用来显示某个电影的平均分,或者提供打分功能,所以我们把它单独写出来,如下图:

  

  image

  创建一个HTMLHeplers类,使用StringBuilder来拼接html,最后这段html将会显示如上图中的星状打分图。代码如下:

 public static class HTMLHelpers
    {
       
        public static string Ratings(this HtmlHelper helper, int Id) 
        {
            float average = 0;
             mediaEntities mediaDB = new mediaEntities();
             var video = mediaDB.Videos.Single(v => v.Id == Id);
 
10              if (video.Ratings.Any())
11                  average = video.Ratings.Average(x => x.Rating1);
12   
13              StringBuilder sb = new StringBuilder();
14              sb.AppendFormat("<span class='rating' rating='{0}' video='{1}' title='{2}'>", average, video.Id, "Click to rating");
15              string formatStr = "<img src='http://images.cnblogs.com/{0}' alt='star' width='5' height='12' class='star' value='{1}' />";
16   
17              for (double i = .5; i <= 5.0; i = i + .5)
18              {
19                  if (i <= (double)average)
20                  {
21                      sb.AppendFormat(formatStr, (i * 2) % 2 == 1 ? "star-left-on.gif" : "star-right-on.gif", i);
22                  }
23                  else
24                  {
25                      sb.AppendFormat(formatStr, (i * 2) % 2 == 1 ? "star-left-off.gif" : "star-right-off.gif", i);
26                  }
27              }
28   
29              if (video.Ratings.Any())
30                  sb.AppendFormat("&nbsp;<span>Currently rated {0:f2} by {1} people</span>", average, video.Ratings.Count);
31              else
32                  sb.AppendFormat("&nbsp;<span>{0}</span>", "Be the first to rate this post");
33              sb.Append("</span>");
34              return sb.ToString();
35          }
36      }

Ratings方法从参数Id可以得到当前打分的是哪个Video,然后从数据库找到这个Video的Comment数量,再计算平均值,通过平均值来确定最终的分数显示哪些图片:

image

如何在View中使用它呢?

首先需要在需要用到的View中或者是Master模板中添加HTMLHelpers类所在的命名空间:

image

Import命名空间后,添加如下代码就可以显示出来这个Video

    <div class="video_rating"><%= Html.Ratings(Model.Video.Id)%></div>

实接下来需要做的是在鼠标移动到星星上时替换图片,也就是显示出来当前的分数。

    $(".star").mouseover(function () {
                var span = $(this).parent("span");
                var newRating = $(this).attr("value");
                setRating(span, newRating);
            });
 
 
            $(".star").mouseout(function () {
                var span = $(this).parent("span");
10                  var rating = span.attr("rating");
11                  setRating(span, rating);
12              });
13                          function setRating(span, rating) {
14                  span.find('img').each(function () {
15                      var value = parseFloat($(this).attr("value"));
16                      var imgSrc = $(this).attr("src");
17                      if (value <= rating)
18                          $(this).attr("src", imgSrc.replace("-off.gif", "-on.gif"));
19                      else
20                          $(this).attr("src", imgSrc.replace("-on.gif", "-off.gif"));
21                  });
22              }

 

点击事件,当鼠标点击时,我们还需要把结果Post到服务器端,,在服务器端添加数据后再计算平均值,最终以json方式返回到客户端显示出来。

点击事件发生时执行如下操作:

    $(".star").click(function () {
                var span = $(this).parent("span");
                var newRating = $(this).attr("value");
                var text = span.children("span");
                var vId = span.attr("video");
                $.post("/Home/SaveRating", { videoId: vId, rating: newRating },
            function (data) {
                var obj = eval('(' + data + ')');
                if (obj.Success) {
10                      text.html("Currently rated " + obj.Result.AverageScore + " by " + obj.Result.Votes + " people"); //modify the text
11                      span.attr("rating", obj.Result.AverageScore); //set the rating attribute
12                      setRating(span, obj.Result.AverageScore); //update the display
13                      alert("Thank you, your vote was casted successfully.");
14                  }
15                  else {
16                      alert(obj.Message); //failure, show message
17                  }
18              }
19          );
20              });

 

可以看到数据post到HomeContorller中的SaveRating方法,它的代码如下:

 [HttpPost]
        public virtual JsonResult SaveRating(int videoId, float rating)
        {
            try
            {
                Rating videoRating = new Rating();
                videoRating.VideoId = videoId;
                videoRating.Rating1 = rating;
                videoRating.Datetime = System.DateTime.Now;
10                  videoRating.User = "Nicholas";
11   
12                  mediaDB.AddToRatings(videoRating);
13                  mediaDB.SaveChanges();
14   
15                  var ratings = mediaDB.Ratings.Where(x => x.VideoId == videoId);
16   
17                  return Json(new JsonResponse
18                      {
19                          Success = true,
20                          Message = "Thanks for your rating",
21                          Result = new
22                          {
23                              AverageScore = ratings.Average(x => x.Rating1).ToString().Substring(0,4),
24                              Votes = ratings.Count()
25                          }
26                      });
27              }
28              catch (Exception ex)
29              {
30                  return Json(new JsonResponse
31                      {
32                          Success = false,
33                          Message = ex.Message
34                      });
35              }
36          }

 

发表评论功能的AJAX实现和对用户输入数据的服务器端验证:

发表评论的View显示如下:

image

和打分功能需要注意的问题一样,不能在用户点击Submit时使用整个form的post数据,这样页面就会刷新,容易杯具。我们没法使用asp.net mvc自带的那个验证功能:

image 

因为使用它来实现验证功能的话,必须让整个页面重新渲染,也就是必须刷新了。但是我不想使用jQuery的validation插件来实现客户端验证,它会让客户端多加载30~40K,最终我还是选择使用服务器端验证,只是通过AJAX方式传回来服务器端的验证信息。这个稍后会详细说明

先说一下我们post数据如何实现,这个和上面rating的实现方法差不多,就是回传的数据比较多而已。

    var id= $("#VideoId").val();
 
 
            $("#save").click(function (e) {
                $(".field-validation-valid").empty();
                var user = $("#comment_User").val();
                var subject = $("#comment_Subject").val();
                var content = $("#comment_Content").val();

                $.post("/Home/SavingComment", { videoId: id, User: user, Subject: subject, 

  Content: content },

10              function (data) {
11                  var obj = eval('(' + data + ')');
12                  if (obj.Success) {
13                      // at the comment to `comments list
14 

                    $("<div style='border: 1px solid black;' class='comment_header'> <img src='http://www.gravatar.com

/avatar/0700fc1343bcd9be89d23ac8b9d8ff21.jpg?s=48' alt='test' /><span style='border-bottom:1px solid black;'>" + user + "=>Said:</span><br /><span style='border-bottom:1px solid black;'>" + subject + "</span> <br /><span>" + content + "</span><br />

<span class='comment_date'>at:" + obj.Message + "</span>    </div>").appendTo('#Comments-area').hide().slideDown('slow');

15                  }
16                  else {
17                      for (var i = 0; i < obj.Result.length; i++) {
18                          $("#" + obj.Result[i].PropertyName).html(obj.Result[i].ErrorMessage).fadeIn("slow");
19                      }
20                  }
21              }
22          );
23              });

这里我使用了jQuery的slidedown()来让评论慢慢显示出来,有点像新浪微薄的刷微薄的样子。

 

当post数据到服务器端时,我们来保存好数据并以json格式返回保存成功的标志位,下面代码中的Success=true。

  mediaDB.AddToComments(new Comment() {  VideoId=videoId,User=User,Subject=Subject,Content=Content,Datetime=System.DateTime.Now});
                mediaDB.SaveChanges();
                return Json(new JsonResponse
                {
                    Success = true,
                    Message = System.DateTime.Now.ToString()
                });

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

保存数据时比较简单的,但是为了完成服务器端的验证信息倒是没那么简单。我们需要创建一个VComment类,如下:

  public class VComment:IValidationModel
    { 
            [Required(ErrorMessage = "VideoId is required")]
            public object VideoId { get; set; }
 
            [Required(ErrorMessage = "User is required")]
            public object VUser { get; set; }
 
            [Required(ErrorMessage = "Subject is required")]
10              [StringLength(100)]
11              public object VSubject { get; set; }
12   
13              [Required(ErrorMessage = "Content is required")]
14              [StringLength(500)]
15              public object VContent { get; set; }
16      }

当实例化这个类后需要通过一个方法GetErrors()来得到所有的不符合验证股则的值,所有的错误信息我们会把它保存在一个ValidationMessage中,最终把错误信息以json方式传送到客户端。

GetErrors()方法:

  public static IEnumerable<ValidationMessage> GetErrors(this IValidationModel instance)
        {
            var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
            var typeObject = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();
            var typeProperties = TypeDescriptor.GetProperties(typeObject).Cast<PropertyDescriptor>();
            var classProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();
 
            return from property in typeProperties
                   join modelProp in classProperties on property.Name equals modelProp.Name
10                     from attribute in property.Attributes.OfType<ValidationAttribute>()
11                     where !attribute.IsValid(modelProp.GetValue(instance))
12 

                   select new ValidationMessage { PropertyName = property.Name, ErrorMessage = attribute.F

ormatErrorMessage(string.Empty) };

13          }
14   

 

验证部分的类之间的关系:

image

在Comment向服务器端post时,先去验证是否可以存入数据库,不可以的话就把错误信息传送给客户端:

image

 

最终给出当输入数据不符合规则时的验证页面显示:

image 

3。电影列表的展示和分页功能

首先是电影的展示,这个功能相对来说比较容易,就是添加Movie这个Controller再添加View。先看看页面:

image

点击上面的图片后就可以进入详细介绍页面。。。。。。你会发现下面有个翻页的button,这里说明下如何实现这个功能:

 public class PageList : List<Video>
    {
        public int PageIndex { get; private set; }
 
        public int PageSize { get; private set; }
 
        public int TotalCount { get; private set; }
 
        public int TotalPages { get; private set; }
10   
11          public PageList(int pageIndex, int pageSize)
12          {
13               mediaEntities mediaDB = new mediaEntities();
14               var videos = mediaDB.Videos;
15              PageIndex = pageIndex;
16              PageSize = pageSize;
17              TotalCount = videos.Count();
18              TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
19   
20              this.AddRange(videos.OrderBy(v => v.Id).Skip(pageIndex * PageSize).Take(PageSize));
21   
22          }
23   
24          public bool HasPreviousPage 
25          {
26              get
27              {
28                  return (PageIndex > 0);
29              }
30          }
31   
32          public bool HasNextPage
33          {
34              get 
35              {
36                  return (PageIndex + 1 < TotalPages);
37              }
38          }
39      }

 

 

 

 

 

 

本来想用过通用的T来代替Video,发现Linq-to-entity里面如果使用Skip方法就得先排序查询结果,后面只有把T换成Video,希望有人给出好的建议。

 

在页面上我们需要通过如下代码来判断当前页面是否有前一页和后一页:

 <div style=" float:right;">
      <%if (Model.HasPreviousPage)
        {%>
      <a href="<%:Url.Action("Index", new {Id=(Model.PageIndex-1)}) %>"><img style=" border:none;" src="http://images.cnblogs.com/previous.jpg"/></a><%} %>
      <% if (Model.HasNextPage) {  %>
       <a href="<%:Url.Action("Index", new {Id=(Model.PageIndex+1)}) %>"><img style=" border:none" src="http://images.cnblogs.com/next.jpg"/></a><%} %></div>
      </div>

 

4。电影详细内容显示

   在详细页面我们需要显示这部电影的主演,年份,以及大家的打分,并提供一个点击后可以播放这部电影的按钮:

image

 

View的代码:

    <div id="video-detail">
<div style=" height:20px; border-bottom:2px solid #3e494a; colol:black; font-weight:bold; font-size:16px;"><%:Model.Title %></div>
<div style="  border-bottom:2px solid #3e494a"><img style="height:320px; width:600px;" src="http://images.cnblogs.com/large.jpg" /></div>
<div style=" height:100px; border-bottom:2px solid #3e494a"><%:Model.Review %></div>
<div style=" height:100px; border-bottom:2px solid #3e494a;">Publish at: <%:Model.Year %> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lead Actors:<%:Model.Actors %>
<br />
<div>Wacth this film here:<a><img src="http://images.cnblogs.com/Silver-Play-Button.jpg" style=" border:none; height:20xp; width:20px;"  /></a></div></div>
<div class="video_rating"><%= Html.Ratings(Model.Id)%></div>
    </div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_749085.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

锦绣蓝图:怎样规划令人流连忘返的网站(第2版)(全彩印刷,信息架构之父R. S. Wurman隆重推荐)...

锦绣蓝图:怎样规划令人流连忘返的网站(第2版)&#xff08;全彩印刷&#xff0c;信息架构之父R. S. Wurman隆重推荐&#xff09;【原 书 名】 Information Architecture: Blueprints for the Web (2nd Edition) 【原出版社】 New Riders Press 【作  者】(美)Christina Wodt…

网站(bs系统)怎样实现即时消息思路总结

为什么80%的码农都做不了架构师&#xff1f;>>> 1.ajax刷新 2.flashsocket(推荐,网页游戏多用这个) 3.DWR用来做即时通讯很方便 4.Comet 有时也称反向 Ajax 或服务器端推技术&#xff08;server-side push&#xff09;&#xff0c;这个东西其实就是长连接&#xff…

手机php网站不显示图片,javascript,_手机页面用innerHTML拼接的图片不显示,javascript - phpStudy...

手机页面用innerHTML拼接的图片不显示测试代码input,button{height:35px;}add function addEmotion(t){alert(t);}var addfunction(){var prefixhttp://192.168.1.100:88/emotion/images/;var emotion[hi,yes,good];var html[];for(var i0;ihtml.push("");}document.…

计算机的电子邮件地址怎么看,电脑使用小技巧:如何找出网站上隐藏的电子邮件地址?...

当访问有些网站时&#xff0c;有时我们需要与网站进行联系&#xff0c;可是点击网站上的“联系我们”时&#xff0c;并没有出现详细的联系信息&#xff0c;比如&#xff1a;地址&#xff0c;邮件&#xff0c;电话等&#xff0c;电脑反而弹出outlook邮件客户端程序。如果我们平时…

dwz框架在网站群项目中的应用(3)—html拓展之控件组件篇

每个页面中由不同的控件和组件提供不同的功能&#xff0c;在“dwz框架”下应用框架的规则只要写简单的html代码就可以写出实用的控件或组件&#xff0c;在项目中用的比较多的有&#xff1a;文本框、日历控件、combox组件、分页组件&#xff0c;下面将继续以项目中的实例介绍这些…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

Smint – 用于单页网站制作的 jQuery 导航菜单插件

Smint 是一款用于实现单页风格网站的 jQuery 导航插件&#xff0c;包含两部分&#xff1a;固定在页面顶部的精美导航条和能够在你点击的时候自动滚动到对应内容的菜单按钮。Smint 使用非常简单&#xff0c;只有一个参数用于设置页面滚动的速度&#xff0c;默认是 500 毫秒&…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

转一篇架构师间的问答------如何对应大数据量网站的考验

提问嘉宾&#xff1a; 林昊&#xff0c;网名BlueDavy&#xff0c;China OSGi User Group Director&#xff0c;淘宝网平台架构部架构师&#xff0c;个人的研究方向主要为Java模块化、动态化系统的构建以及高性能的大型分布式Java系统的构建。曾编写《OSGi实战》和《OSGi进阶》…

《大型网站技术架构》读书笔记 - 网站的技术升级路线

《大型网站技术架构》读书笔记 - 网站的技术升级路线 本文描述网站从小到大演变过程中的技术升级路线&#xff1b; 1.初始架构 一台服务器&#xff0c;应用、DB、文件都在一块&#xff0c;使用经典的LAMP模式构建整个站点&#xff1b; 优点很明显&#xff0c;开发部署都简单&am…

历史最全Transformer注意力机制综述论文、代码及网站资源整理分享

Google于2017年6月在arxiv上发布了一篇非常经典的文章&#xff1a;Attention is all you need&#xff0c;提出了解决sequence to sequence问题的transformer模型&#xff0c;该文章使用全Attention的结构代替了LSTM&#xff0c;抛弃了之前传统的encoder-decoder模型必须结合CN…

网站架构的伸缩性设计

网站开发初期&#xff0c;我们习惯性把所有代码都写到一个项目中。前台、后台、缓存、数据库、静态资源... 等等。网站系统物理分离慢慢的系统会原来越大&#xff0c;很显然需要面对大量用户的高并发访问和存储海量数据。很多用户的请求&#xff0c;不可能在一台服务器上完成。…

11月钓鱼网站:.COM域名超56% 新网数码占比37%

IDC评述网&#xff08;idcps.com&#xff09;12月15日报道&#xff1a;近日&#xff0c;中国反钓鱼网站联盟发布了《2014年11月钓鱼网站处理简报》。据报告显示&#xff0c;11月份&#xff0c;联盟共处理钓鱼网站4820个&#xff0c;较上月有所增加&#xff1b;截至2014年11月份…

采用SharePoint Designer将JavaScript而他们的网站页面集成的定义

采用SharePoint Designer将JavaScript而他们的网站页面集成的定义 像JavaScript这种动态脚本语言可以给你的页面震撼效果。为了加盟JavaScript要定义自己的网站页面。面步骤&#xff1a;1. 打开SharePoint Designer 2010. 点击左側站点页面。2. 新建Web Part页面&#xff0c;重…

如何用代码设置控制自己网站的网页在360浏览器打开时强制优先使用极速模式,而非兼容模式...

在head标签中添加一行代码&#xff1a; <html><head><meta name"renderer" content"webkit|ie-comp|ie-stand" /></head><body></body> </html> content的取值为webkit,ie-comp,ie-stand之一&#xff0c;区分大…

IIS10 部署网站报【HTTP 错误 500.19 - Internal Server Error】的解决办法

今天迁移web服务突然遇到一个Error问题&#xff0c;但原有的web发布文件是可以正常部署 IIS10 上面运行的&#xff0c;这是啥情况呢&#xff1f;顺便把解决该问题的全过程整理出来&#xff0c;分享给更多遇到类似情况的小伙伴。 由于本地电脑环境迁移&#xff0c;重新换了一个…

IIS 部署网站对 OPTIONS 请求直接返回 40x 的处理

什么是 OPTIONS 请求 OPTIONS 请求为 ** 发送非简单跨域请求前的预检请求** &#xff0c;若该请求未正常返回&#xff0c;浏览器会阻止后续的请求发送。 一般情况下&#xff0c;有三种方式会导致浏览器发起预检请求&#xff1a; 请求的方法不是 GET/HEAD/POST&#xff1b; PO…

github上不去_网站优化很久了上不去怎么办

在解决网站没有排名的这个问题&#xff0c;首先需要明确的是各个搜索引擎给予网站的排名规则是什么&#xff0c;网站需要做好哪些优化要素才能够提高网站在搜索引擎当中的搜索排名&#xff0c;获得更多的流量资源。 一般搜索引针对网站的搜索排名&#xff0c;用户搜索的内容贵…

大型网站技术架构(四)--网站的高性能架构(转)

http://blog.csdn.net/chaofanwei/article/details/27168603 网站性能是客观的指标&#xff0c;可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。 1、性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间&#xff0c;指从发出请求到最后收到响应数据所需要…