后台查询结果 PDFSearchResult实体类:

  1. [DataContract(Name = "PDFSearchResult")]
  2. public class PDFSearchResult
  3. {
  4.  
  5. public PDFSearchResult(string title, string fileUrl)
  6. {
  7. Title = title;
  8. FileUrl = fileUrl;
  9. }
  10.  
  11. [DataMember(Name = "title")]
  12. public string Title { get; set; }
  13.  
  14. [DataMember(Name = "fileUrl")]
  15. public string FileUrl { get; set; }
  16.  
  17. }

另外,有一个PagedResult泛型类,PagedResult<T>

  1. [DataContract(Name = "pagedCollection", Namespace = "")]
  2. public class PagedResult<T>
  3. {
  4. public PagedResult(long totalItems, long pageNumber, long pageSize);
  5.  
  6. [DataMember(Name = "items")]
  7. public IEnumerable<T> Items { get; set; }
  8. [DataMember(Name = "pageNumber")]
  9. public long PageNumber { get; }
  10. [DataMember(Name = "pageSize")]
  11. public long PageSize { get; }
  12. [DataMember(Name = "totalItems")]
  13. public long TotalItems { get; }
  14. [DataMember(Name = "totalPages")]
  15. public long TotalPages { get; }
  16.  
  17. //
  18. // Summary:
  19. // Calculates the skip size based on the paged parameters specified
  20. //
  21. // Remarks:
  22. // Returns 0 if the page number or page size is zero
  23. public int GetSkipSize();
  24. }

后台,采用Web Api (/api/SearchApi/GetPDFSearchResults/), 返回值类型为 PagedResult<PDFSearchResult>, 是Json类型返回值

在页面表现UI层,有两个tab,左边的tab显示的是页面的搜索结果searchResult, 右边的tab显示的是pdf文件的搜索结果PDFSearchResult

页面SearchResult.cshtml如下:

  1. <section id="searchListing" class="row search">
  2. <div>
  3.  
  4. <div class="tabs">
  5. <ul class="tab">
  6. <li data-ui="tab-nav"><a href="#">Web Page Results</a></li>
  7. <li data-ui="tab-nav"><a href="#">PDF Results</a></li>
  8. </ul>
  9. </div>
  10. <div class="tabContent">
  11. <div id="resultsArea" class="search-results" style="display:block;" data-ui="tab-content">
  12. <div id="NoResultsMessage" style="display:none;">
  13. <p class="results-title">No Results For<strong class="search-term"></strong>'</p>
  14. </div>
  15. <div id="HasResultsMessage" style="display:none;">
  16. <p class="results-title">Search Results For<strong class="search-term"></strong>'</p>
  17. </div>
  18. <div class="results" id="SearchResultsContainer">
  19. <article class="row">
  20. <a href="#">
  21. <div>
  22. <h2></h2>
  23. <p></p>
  24.  
  25. <p class="link">Read more</p>
  26. </div>
  27. </a>
  28. </article>
  29. </div>
  30. <ul class="pagination">
  31. <li><a href="#" class="prev"><i class="gi icon-arrow"></i></a></li>
  32. <li class="page"><a href="#"></a></li>
  33. <li><a href="#" class="next"><i class="gi icon-arrow"></i></a></li>
  34. </ul>
  35. </div>
  36. <div id="PDFResultArea" class="search-results" style="display:none;" data-ui="tab-content">
  37. <div id="NoPDFResultsMessage" style="display:none;">
  38. <p class="results-title">No Results For<strong class="search-term"></strong>'</p>
  39. </div>
  40. <div id="HasPDFResultsMessage" style="display:none;">
  41. <p class="results-title">Search Results For<strong class="search-term"></strong>'</p>
  42. </div>
  43. <div class="results" id="SearchPDFResultsContainer">
  44. <article class="row">
  45. <a href="#">
  46.  
  47. </a>
  48. </article>
  49. </div>
  50. <ul class="pagination">
  51. <li><a href="#" class="prev"><i class="gi icon-arrow"></i></a></li>
  52. <li class="page"><a href="#"></a></li>
  53. <li><a href="#" class="next"><i class="gi icon-arrow"></i></a></li>
  54. </ul>
  55.  
  56. </div>
  57. </div>
  58. </div>
  59. </section>

这里,在页面展示上,应该看上去如下图:

为了在同一个页面,也就是SearchResult.cshtml中实现这个tab功能,我用JQuery写了个tab功能,如下

tab.js

  1. function tabs(state,control,show){
  2.  
  3. $(control + "> li").on(state, function(){
  4.  
  5. $(this).addClass("on").siblings().removeClass("on");
  6.  
  7. var index = $(this).index();
  8.  
  9. $(show + "> div").eq(index).show().siblings().hide();
  10. })
  11.  
  12. $(control + "> li").eq(0).attr("class", "on");
  13. $(show + "> div").eq(0).show();
  14. }
  15.  
  16. tabs("click", ".tab", ".tabContent");

The css style 如下

  1. .tabs {
  2. position: relative;
  3. margin-top: 60px;
  4. margin-bottom: 20px; }
  5. .tabs > ul {
  6. list-style: none;
  7. border-bottom: 1px solid #c0c0c0;
  8. margin-top:;
  9. padding:; }
  10. .tabs > ul > li {
  11. float: left;
  12. margin-bottom: -1px; }
  13. [dir="rtl"] .tabs > ul > li {
  14. float: right; }
  15. .tabs > ul > li a {
  16. display: block;
  17. line-height:;
  18. margin-right: .2rem;
  19. padding: 0 1rem;
  20. border: 1px solid transparent;
  21. text-decoration: none;
  22. cursor: pointer; }
  23. [dir="rtl"] .tabs > ul > li a {
  24. margin-right:;
  25. margin-left: .2rem; }
  26. .tabs > ul > li a:hover {
  27. background: #fff !important;
  28. border: 1px solid #fff !important;
  29. color: #ff7900; }
  30. .tabs > ul > li > [aria-selected="true"], .tabs > ul > li > [aria-selected="true"]:hover {
  31. background: red !important; }
  32. .tabs > ul li.on {
  33. background-color: #fff;
  34. border: 1px solid #c0c0c0;
  35. border-bottom-color: transparent;
  36. color: #454545;
  37. cursor: default; }
  38. .tabs > ul li.on a {
  39. color: #ff7900; }
  40. .tabs > * {
  41. display: none; }
  42. .tabs > ul,
  43. .tabs [tabIndex="0"] {
  44. display: block; }

然后,我写了一个Jquery Plugin来实现PDFSearchResult的展示功能,也就是说JSON结果,展示到SearchResult.cshtml页面上

在这个Jquery plugin中,调用ajax来调用web api (/api/SearchApi/GetPDFSearchResults/),返回json结果,展现到web页面上

view.pdfsearch.js

  1. (function ($) {
  2.  
  3. $.fn.PDFSearch = function (options) {
  4.  
  5. return this.each(function () {
  6.  
  7. var pdfSearch = $(this);
  8.  
  9. pdfSearch.pdfResultArea = pdfSearch.find("#PDFResultArea");
  10.  
  11. pdfSearch.noPDFResultMessage = pdfSearch.pdfResultArea.find("#NoPDFResultsMessage");
  12. pdfSearch.hasPDFResultMessage = pdfSearch.pdfResultArea.find("#HasPDFResultsMessage");
  13. pdfSearch.PDFResultContainer = pdfSearch.pdfResultArea.find("#SearchPDFResultsContainer");
  14.  
  15. pdfSearch.searchPDFResultTemplate = pdfSearch.PDFResultContainer.find("article").clone();
  16.  
  17. pdfSearch.queryField = $("input[name='search']");
  18.  
  19. pdfSearch.searchTermLabel = $(".search-term");
  20.  
  21. pdfSearch.oldTerm = undefined;
  22. pdfSearch.term = pdfSearch.queryField.val();
  23.  
  24. //Paging elements
  25. pdfSearch.paginationWrapper = pdfSearch.pdfResultArea.find('ul.pagination');
  26. pdfSearch.pageTemplate = pdfSearch.paginationWrapper.find('.page').clone();
  27. pdfSearch.pagePrevious = pdfSearch.paginationWrapper.find('.prev');
  28. pdfSearch.pageNext = pdfSearch.paginationWrapper.find('.next');
  29.  
  30. // Page tracking
  31. pdfSearch.pageSize = 10;
  32. pdfSearch.pageNumber = 1;
  33. pdfSearch.totalPages = 0;
  34.  
  35. // Sets up pagination for search results.
  36. pdfSearch.paginate = function (data) {
  37.  
  38. pdfSearch.totalPages = data.totalPages;
  39. pdfSearch.paginationWrapper.find('.page').remove();
  40. if (pdfSearch.totalPages > 1) {
  41. pdfSearch.pagePrevious.toggle(data.pageNumber > 1);
  42. pdfSearch.pageNext.toggle(data.pageNumber < pdfSearch.totalPages);
  43.  
  44. for (i = 1; i < pdfSearch.totalPages + 1; i++) {
  45. var page = pdfSearch.pageTemplate.clone();
  46. var link = page.find('a');
  47. if (i == data.pageNumber)
  48. page.addClass('active');
  49. page.data('page', i);
  50. link.text(i);
  51.  
  52. pdfSearch.pageNext.parent().before(page).before('\n\r');
  53. }
  54.  
  55. pdfSearch.paginationWrapper.show(0);
  56. } else {
  57. pdfSearch.paginationWrapper.hide(0);
  58. }
  59. }
  60.  
  61. pdfSearch.previous = function (evt) {
  62. return pdfSearch.goToPage(evt, pdfSearch.pageNumber - 1);
  63. }
  64.  
  65. pdfSearch.next = function (evt) {
  66. return pdfSearch.goToPage(evt, pdfSearch.pageNumber + 1);
  67. }
  68.  
  69. pdfSearch.goToPage = function (evt, pageNumber) {
  70. pdfSearch.pageNumber = pageNumber || $(this).data('page');
  71. if (pdfSearch.pageNumber > pdfSearch.totalPages) pdfSearch.pageNumber = pdfSearch.totalPages - 1;
  72. if (pdfSearch.pageNumber < 1) pdfSearch.pageNumber = 1;
  73.  
  74. pdfSearch.searchPDF();
  75. return false;
  76. }
  77.  
  78. // filter change handler
  79. pdfSearch.handleQuery = function (evt) {
  80.  
  81. pdfSearch.term = $(this).val();
  82. if (pdfSearch.oldTerm != pdfSearch.term) {
  83. pdfSearch.oldTerm = pdfSearch.term;
  84. pdfSearch.searchPDF();
  85. }
  86. return false;
  87. }
  88.  
  89. pdfSearch.searchPDF = function () {
  90. pdfSearch.pdfResultArea.addClass("loading");
  91.  
  92. $.ajax({
  93. type: "GET",
  94. url: "/umbraco/api/SearchApi/GetPDFSearchResults/",
  95. dataType: "json",
  96. data: {
  97. filter: pdfSearch.term,
  98. pageNumber: pdfSearch.pageNumber,
  99. pageSize: pdfSearch.pageSize
  100. },
  101. success: function (data) {
  102. pdfSearch.searchTermLabel.text(pdfSearch.term);
  103. pdfSearch.noPDFResultMessage.hide();
  104. pdfSearch.hasPDFResultMessage.hide();
  105. pdfSearch.paginate(data);
  106. pdfSearch.PDFResultContainer.empty();
  107.  
  108. if (!data.items || data.items.length == 0) {
  109. pdfSearch.noPDFResultMessage.show();
  110. }
  111. else {
  112. // Binding search result to UI
  113. for (var i = 0; i < data.items.length; i++) {
  114. var pdfResult = data.items[i];
  115. var PdfResultTemplate = pdfSearch.searchPDFResultTemplate.clone();
  116.  
  117. _populatePDFContent(pdfResult, PdfResultTemplate);
  118.  
  119. pdfSearch.PDFResultContainer.append(PdfResultTemplate);
  120. }
  121. pdfSearch.hasPDFResultMessage.show();
  122. }
  123. },
  124. complete: function () {
  125. pdfSearch.searchTermLabel.text(pdfSearch.term);
  126. pdfSearch.pdfResultArea.removeClass("loading");
  127. }
  128. });
  129. };
  130.  
  131. _populatePDFContent = function (result, template) {
  132.  
  133. var pdfLinkElem = $(template.find("a"));
  134. pdfLinkElem.attr("href", result.fileUrl);
  135. pdfLinkElem.attr("target", "_blank");
  136. pdfLinkElem.html(result.title);
  137.  
  138. };
  139.  
  140. pdfSearch.queryField.on("keyup", pdfSearch.handleQuery);
  141.  
  142. // Setup pagination triggers.
  143. pdfSearch.pagePrevious.on("click", pdfSearch.previous);
  144. pdfSearch.pageNext.on("click", pdfSearch.next);
  145.  
  146. // Bind to all future page clicks.
  147. pdfSearch.paginationWrapper.on('click', 'li.page', pdfSearch.goToPage);
  148.  
  149. pdfSearch.searchPDF();
  150.  
  151. });
  152. }
  153. }(jQuery));
  154.  
  155. $(function () {
  156. $('section.search').PDFSearch();
  157.  
  158. });

自己在项目中写的一个Jquery插件和Jquery tab 功能的更多相关文章

  1. 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能

    在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...

  2. Web 项目中分享到微博、QQ空间等分享功能

    Web 项目中分享到微博.QQ空间等分享功能 网上有很多的模板以及代码,但是有很多都不能分享内容,简单的测试了下: 以新浪微博为例,文本框中的内容是title属性,下面的链接是url属性,如果你的链接 ...

  3. C# winform项目中ListView控件使用CheckBoxes属性实现单选功能

    C# winform项目中ListView控件使用CheckBoxes属性实现单选功能 在做项目时需要使用ListView控件的CheckBoxes属性显示,还要在点击行时自动选中CheckBoxes ...

  4. 解决:一个项目中写多个包含main函数的源文件并分别调试运行

    自己在学c++的时候,一个项目中的多个cpp文件默认不允许多个main函数的出现,但是通过选项操作能够指定单个cpp文件进行运行,如下: 1.此时我就想运行第二个cpp文件,我们只需要把其他的两个右键 ...

  5. 在类库或winform项目中打开另一个winform项目的窗体

    假设类库或winform项目为A,另一个winform项目为B.那麽在A中添加一个接口,里面有一个Show方法,然后在B中写一个类b继承这个接口,并重写这个方法,具体内容为弹出某个窗体.然后在A中另一 ...

  6. 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程

    在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...

  7. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  8. MES项目中出现的一个事务嵌套的使用场景

    昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...

  9. 【Atom】在一个中/大型项目中,那些好用而强大的atom功能

      作为一个学生党,一开始使用atom时候并没有意识到atom一些小功能的巨大作用,直到自己实习参与了项目,才知道这些功能在一个项目中是能极大提高工作效率的开发利器   下面是一位不愿意透露其姓名的彭 ...

随机推荐

  1. vue-cli与后台数据交互增删改查

    1. 安装vue-resource npm install vue-resource --save 2.访问后台地址,在vue中会出现跨域的问题,以下为解决方案 在config下的index.js 中 ...

  2. 洛谷 2261 [CQOI2007]余数求和

    题目戳这里 一句话题意 求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\) Solution 30分做法: 说实话并不知道怎么办. 60分做法: 很明显直接一遍o( ...

  3. 3款Linux网络监视工具

    1 iftop: 如果你想看到现在你的带宽到底是哪些应用在使用,并且各个应用占据了多少带宽的时候,可以用iftop显示出来.使用的参数如下: -h                  display t ...

  4. 一起来学linux:例行性任务之at和crontab

    对于我们日常生活来说,有很多例行需要进行的工作,比如每天早上起床一杯水,例如家人的生日,每天的起床时间等.这性例行的工作有可能被遗忘,但是如果我们用计算机来进行提醒的话,则方便很多.这里就要介绍到Li ...

  5. case_for_if 各种嵌套相结合

    注明:本文是参考其他相关文章 整理,完全尊重原著作 #!/bin/bash usage() { cat << EOF EOF } main() { echo "猜分数赢大奖(0- ...

  6. 将QQ登录接口整合到你的网站和如何修改配置

    http://www.phpfensi.com/php/20140727/3998.html 摘要:QQ登录的官方SDK进行了一些修改,使其更加容易的整合到自己的网站上去... 对QQ登录的官方SDK ...

  7. Exception of type 'System.OutOfMemoryException' was thrown

    最近刚换了服务器,开始测试的时候未发现什么问题,可是一旦同一时间段操作的人比较多的时候,就会抛出如下错误: Server Error in '/' Application. Exception of ...

  8. Mac安装 Storm 小结

    Strom 安装&部署 本地执行:Storm Topology是可进行本地运行的, 必须在发布前进行本地测试, 以确保代码本身业务逻辑没有问题( Windows也可执行, 但是由于权限等原因, ...

  9. 织梦CMS博客风格模板

    织梦CMS博客风格模板,织梦CMS,博客模板,CMS模板.程序模板. 模板地址:http://www.huiyi8.com/sc/7248.html

  10. 存储过程之rowtype 使用

    CREATE OR REPLACE PROCEDURE "DYLYLQX_SC_BA_1" (YWID IN VARCHAR2, FLAG OUT VARCHAR2) IS V_R ...