Repository: sgjsakura/AspNetCore Branch: master Commit: e7c4d155af85 Files: 200 Total size: 508.1 KB Directory structure: gitextract_s1v18kb7/ ├── .gitattributes ├── .gitignore ├── LICENSE.txt ├── PagerDemo.md ├── PagerDemov1.md ├── README.md ├── Sakura.AspNetCore.Extensions/ │ ├── Directory.Build.props │ ├── Sakura.AspNetCore.AsyncPagedList/ │ │ ├── AsyncCacheable.cs │ │ ├── AsyncPagedList.cs │ │ ├── IAsyncPagedList.cs │ │ ├── PagedListCreationHelper.cs │ │ ├── Properties/ │ │ │ ├── Annotations.cs │ │ │ └── AssemblyInfo.cs │ │ └── Sakura.AspNetCore.AsyncPagedList.csproj │ ├── Sakura.AspNetCore.Authentication.ExternalCookie/ │ │ ├── ApplicationBuilderExtensions.cs │ │ ├── ExternalSecurityStampValidator.cs │ │ ├── ExternalSignInManager.Net1.cs │ │ ├── ExternalSignInManager.Net2.cs │ │ ├── ExternalSignInManager.cs │ │ ├── IdentityHelper.cs │ │ ├── Sakura.AspNetCore.Authentication.ExternalCookie.csproj │ │ └── ServiceCollectionExtensions.cs │ ├── Sakura.AspNetCore.DynamicLocalizer/ │ │ ├── IDynamicHtmlLocalizer.cs │ │ ├── IDynamicStringLocalizer.cs │ │ ├── IDynamicViewLocalizer.cs │ │ ├── Internal/ │ │ │ ├── DynamicHtmlLocalizer.cs │ │ │ ├── DynamicHtmlLocalizerWrapper.cs │ │ │ ├── DynamicHtmlTextLocalizerWrapper.cs │ │ │ ├── DynamicStringLocalizer.cs │ │ │ ├── DynamicStringLocalizerWrapper.cs │ │ │ ├── DynamicViewLocalizer.cs │ │ │ └── IDynamicLocalizerWrapper.cs │ │ ├── Sakura.AspNetCore.DynamicLocalizer.csproj │ │ └── ServiceCollectionExtensions.cs │ ├── Sakura.AspNetCore.Extensions.sln │ ├── Sakura.AspNetCore.Extensions.sln.DotSettings │ ├── Sakura.AspNetCore.Localization.Dictionary/ │ │ ├── DictionaryStringLocalizer.cs │ │ └── Sakura.AspNetCore.Localization.Dictionary.csproj │ ├── Sakura.AspNetCore.Messages/ │ │ ├── DefaultOperationMessageAccessor.cs │ │ ├── OperationMessageOptions.cs │ │ ├── OperationMessageServiceCollectionExtensions.cs │ │ └── Sakura.AspNetCore.Messages.csproj │ ├── Sakura.AspNetCore.Messages.Abstractions/ │ │ ├── IOperationMessageAccessor.cs │ │ ├── OperationMessage.cs │ │ ├── OperationMessageExtensions.cs │ │ ├── OperationMessageLevel.cs │ │ └── Sakura.AspNetCore.Messages.Abstractions.csproj │ ├── Sakura.AspNetCore.Mvc.ActionResultExceptionExtensions/ │ │ ├── ActionResultException.cs │ │ ├── EnableActionResultExceptionAttribute.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Sakura.AspNetCore.Mvc.ActionResultExceptionExtensions.csproj │ │ └── ServiceExtensions.cs │ ├── Sakura.AspNetCore.Mvc.Messages/ │ │ ├── CssClassBasedIconMapper.cs │ │ ├── IIconMapper.cs │ │ ├── IIconToCssClassMapper.cs │ │ ├── IOperationMessageHtmlGenerator.cs │ │ ├── IOperationMessageLevelToStyleMapper.cs │ │ ├── Implementations/ │ │ │ ├── Bootstrap5AlertMessageContentLayout.cs │ │ │ ├── Bootstrap5AlertMessageHtmlGenerator.cs │ │ │ ├── Bootstrap5AlertMessageHtmlGeneratorOptions.cs │ │ │ ├── Bootstrap5MessagesServiceBuilder.cs │ │ │ ├── Bootstrap5ToastMessageHtmlGenerator.cs │ │ │ ├── Bootstrap5ToastMessageHtmlGeneratorOptions.cs │ │ │ ├── BootstrapBuilderExtensions.cs │ │ │ ├── BootstrapIconCssClassMapperOptions.cs │ │ │ ├── BootstrapIconMapper.cs │ │ │ ├── BootstrapIconStyle.cs │ │ │ ├── DefaultBootstrap5OperationMessageLevelToStyleMapper.cs │ │ │ ├── DefaultBootstrapIconCssClassMapper.cs │ │ │ ├── HorizontalAlignment.cs │ │ │ ├── IBootstrapIconServiceBuilder.cs │ │ │ ├── Utility.cs │ │ │ └── VerticalAlignment.cs │ │ ├── MessageTagHelper.cs │ │ ├── OperationMessageServiceBuilder.cs │ │ ├── Sakura.AspNetCore.Mvc.Messages.csproj │ │ ├── ServiceCollectionExtensions.cs │ │ └── StaticIIconToCssClassMapper.cs │ ├── Sakura.AspNetCore.Mvc.PagedList/ │ │ ├── FirstAndLastPagerItemActiveMode.cs │ │ ├── Generators/ │ │ │ ├── BaseUriLinkGenerator.cs │ │ │ ├── CustomHtmlContentGenerator.cs │ │ │ ├── CustomLinkGenerator.cs │ │ │ ├── CustomQueryStringLinkGenerator.cs │ │ │ ├── CustomQueryValueLinkGenerator.cs │ │ │ ├── CustomStringContentGenerator.cs │ │ │ ├── DisabledLinkGenerator.cs │ │ │ ├── FormattedLinkGenerator.cs │ │ │ ├── FormattedQueryValueLinkGenerator.cs │ │ │ ├── FormattedStringContentGenerator.cs │ │ │ ├── FragmentLinkGenerator.cs │ │ │ ├── QueryStringLinkGenerator.cs │ │ │ ├── QueryValueLinkGenerator.cs │ │ │ ├── SimpleLinkGenerator.cs │ │ │ ├── SimpleQueryValueLinkGenerator.cs │ │ │ ├── SimpleStringContentGenerator.cs │ │ │ └── StringContentGenerator.cs │ │ ├── IPagerItemContentGenerator.cs │ │ ├── IPagerItemLinkGenerator.cs │ │ ├── Internal/ │ │ │ ├── BootstrapPagerHtmlGenerator.cs │ │ │ ├── DefaultPagerGenerator.cs │ │ │ ├── DefaultPagerListGenerator.cs │ │ │ ├── DefaultPagerRenderingListGenerator.cs │ │ │ ├── IPagerGenerator.cs │ │ │ ├── IPagerHtmlGenerator.cs │ │ │ ├── IPagerListGenerator.cs │ │ │ ├── IPagerRenderingListGenerator.cs │ │ │ ├── PagerGenerationContext.cs │ │ │ ├── PagerItem.cs │ │ │ ├── PagerItemContentGeneratorConverter.cs │ │ │ ├── PagerItemLinkGeneratorConverter.cs │ │ │ ├── PagerItemType.cs │ │ │ ├── PagerLayoutConverter.cs │ │ │ ├── PagerList.cs │ │ │ ├── PagerRenderingItem.cs │ │ │ ├── PagerRenderingItemState.cs │ │ │ ├── PagerRenderingList.cs │ │ │ ├── StringToHtmlContentConverter.cs │ │ │ └── Utility.cs │ │ ├── PagerGenerationMode.cs │ │ ├── PagerItemContentGenerators.cs │ │ ├── PagerItemGenerationContext.cs │ │ ├── PagerItemLinkGenerators.cs │ │ ├── PagerItemMode.cs │ │ ├── PagerItemOptions.cs │ │ ├── PagerItemOptionsSet.cs │ │ ├── PagerLayout.cs │ │ ├── PagerLayoutElement.cs │ │ ├── PagerLayouts.cs │ │ ├── PagerOptions.cs │ │ ├── PagerOptionsExtensions.cs │ │ ├── Sakura.AspNetCore.Mvc.PagedList.csproj │ │ ├── ServiceCollectionExtensions.cs │ │ ├── SpecialPagerItemInactiveBehavior.cs │ │ └── TagHelpers/ │ │ ├── AjaxOptions.cs │ │ ├── AjaxUpdateMode.cs │ │ ├── PagerTagHelper.cs │ │ └── TagHelperUtility.cs │ ├── Sakura.AspNetCore.Mvc.TagHelpers/ │ │ ├── AuthorizeAttributeTagHelper.cs │ │ ├── AuthorizeTagHelper.cs │ │ ├── AuthorizeTagHelperBase.cs │ │ ├── ConditionalClassTagHelper.cs │ │ ├── DisplayTextTagHelper.cs │ │ ├── EnumForSelectTagHelper.cs │ │ ├── EnumOptionValueSource.cs │ │ ├── EnumSelectTagHelper.cs │ │ ├── EnumTypeSelectTagHelper.cs │ │ ├── EnumValueTextHelper.cs │ │ ├── FlagsEnumInputTagHelper.cs │ │ ├── FlagsEnumModelBinder.cs │ │ ├── FlagsEnumModelBinderProvider.cs │ │ ├── FlagsEnumModelBinderServiceCollectionExtensions.cs │ │ ├── HtmlGeneratorHelper.cs │ │ ├── IdFormatTagHelper.cs │ │ ├── OptionLabelPosition.cs │ │ ├── PartialViewItemTagHelper.cs │ │ ├── ReflectionHelper.cs │ │ ├── ResourceHelper.cs │ │ ├── Sakura.AspNetCore.Mvc.TagHelpers.csproj │ │ ├── SelectOptionLabelTagHelper.cs │ │ ├── SelectValueOptionTagHelper.cs │ │ ├── SelectValueTagHelper.cs │ │ ├── TextSource.cs │ │ └── ViewDataExtensions.cs │ ├── Sakura.AspNetCore.Mvc.TempDataExtensions/ │ │ ├── EnhancedSessionStateTempDataProvider.cs │ │ ├── HtmlContentConverter.NetCoreApp3.cs │ │ ├── HtmlContentConverter.cs │ │ ├── IObjectSerializer.cs │ │ ├── JsonObjectSerializer.cs │ │ ├── Sakura.AspNetCore.Mvc.TempDataExtensions.csproj │ │ ├── SerializedObjectInfo.cs │ │ ├── ServiceCollectionExtensions.cs │ │ ├── TempDataSerializationOptions.cs │ │ └── TypedJsonTempDataSerializer.cs │ ├── Sakura.AspNetCore.Mvc.VisualStyles/ │ │ ├── Sakura.AspNetCore.Mvc.VisualStyles.csproj │ │ ├── VisualStyle.cs │ │ ├── VisualStyleMatchResult.cs │ │ ├── VisualStyleMatchType.cs │ │ ├── VisualStyleOptions.cs │ │ └── VisualStyleService.cs │ ├── Sakura.AspNetCore.PagedList/ │ │ ├── CacheMode.cs │ │ ├── Cacheable.cs │ │ ├── DisableAutoRefreshController.cs │ │ ├── DynamicPagedList.cs │ │ ├── DynamicPagedListBase.cs │ │ ├── DynamicPagedListCacheOptions.cs │ │ ├── DynamicQueryablePagedList.cs │ │ ├── ICacheControl.cs │ │ ├── PagedList.cs │ │ ├── PagedListCreationHelper.cs │ │ └── Sakura.AspNetCore.PagedList.csproj │ ├── Sakura.AspNetCore.PagedList.Abstractions/ │ │ ├── DynamicPagedListExtensions.cs │ │ ├── IDynamicPagedList.cs │ │ ├── IPagedList.cs │ │ ├── PagedListExtensions.cs │ │ └── Sakura.AspNetCore.PagedList.Abstractions.csproj │ ├── Sakura.AspNetCore.PagedList.Async/ │ │ ├── AsyncPagedListCreationHelper.cs │ │ └── Sakura.AspNetCore.PagedList.Async.csproj │ └── Sakura.EntityFrameworkCore.FromSqlExtensions/ │ ├── DbContextFromSqlExtensions.cs │ └── Sakura.EntityFrameworkCore.FromSqlExtensions.csproj └── TagHelperDemo.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ ############################################################################### # Set default behavior to automatically normalize line endings. ############################################################################### * text=auto ############################################################################### # Set default behavior for command prompt diff. # # This is need for earlier builds of msysgit that does not have it on by # default for csharp files. # Note: This is only used by command line ############################################################################### #*.cs diff=csharp ############################################################################### # Set the merge driver for project and solution files # # Merging from the command prompt will add diff markers to the files if there # are conflicts (Merging from VS is not affected by the settings below, in VS # the diff markers are never inserted). Diff markers may cause the following # file extensions to fail to load in VS. An alternative would be to treat # these files as binary and thus will always conflict and require user # intervention with every merge. To do so, just uncomment the entries below ############################################################################### #*.sln merge=binary #*.csproj merge=binary #*.vbproj merge=binary #*.vcxproj merge=binary #*.vcproj merge=binary #*.dbproj merge=binary #*.fsproj merge=binary #*.lsproj merge=binary #*.wixproj merge=binary #*.modelproj merge=binary #*.sqlproj merge=binary #*.wwaproj merge=binary ############################################################################### # behavior for image files # # image files are treated as binary by default. ############################################################################### #*.jpg binary #*.png binary #*.gif binary ############################################################################### # diff behavior for common document formats # # Convert binary document formats to text before diffing them. This feature # is only available from the command line. Turn it on by uncommenting the # entries below. ############################################################################### #*.doc diff=astextplain #*.DOC diff=astextplain #*.docx diff=astextplain #*.DOCX diff=astextplain #*.dot diff=astextplain #*.DOT diff=astextplain #*.pdf diff=astextplain #*.PDF diff=astextplain #*.rtf diff=astextplain #*.RTF diff=astextplain ================================================ FILE: .gitignore ================================================ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ [Xx]64/ [Xx]86/ [Bb]uild/ bld/ [Bb]in/ [Oo]bj/ # Visual Studio 2015 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # DNX project.lock.json artifacts/ *_i.c *_p.c *_i.h *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db # Visual Studio profiler *.psess *.vsp *.vspx *.sap # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding add-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # TODO: Un-comment the next line if you do not want to checkin # your web deploy settings because they may include unencrypted # passwords #*.pubxml *.publishproj # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config # NuGet v3's project.json files produces more ignoreable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Microsoft Azure ApplicationInsights config file ApplicationInsights.config # Windows Store app package directory AppPackages/ BundleArtifacts/ # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !*.[Cc]ache/ # Others ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl *.dbproj.schemaview *.pfx *.publishsettings node_modules/ orleans.codegen.cs # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm # SQL Server files *.mdf *.ldf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # LightSwitch generated files GeneratedArtifacts/ ModelManifest.xml # Paket dependency manager .paket/paket.exe # FAKE - F# Make .fake/ ================================================ FILE: LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: PagerDemo.md ================================================ # ASP.NET Core Data Paging and Pager Usage Guide *Note: here is the guide of version 2. For the version 1 guide, please click [here](PagerDemov1.md).* This page will give you a step-by-step guide to use ASP.NET Core MVC Data Paging and Pager features. This guide includes the following topics: - How to paging your data source - How to enumerate your data page and get paging information - How to show a pager in your ASP.NET Core MVC Web Page The following packages are required for this guide: - `Sakura.AspNetCore.PagedList`: for data paging - `Sakura.AspNetCore.PagedList.Async`: for async data paging - `Sakura.AspNetCore.Mvc.PagedList`: for HTML pager generation ## Data Paging Before using the ASP.NET Core MVC Pager, usually you may want to paging your data source (which may come from a EntityFramework or memory query) first. The `Sakura.AspNetCore.PagedList` package provides a interface named `IPagedList` to represent as a paged data source. The easiest way to create an instance of it is to use the extension methods defined in `Sakura.AspNetCore.PagedListCreationHelper` class. The following code shows the basic usage: ```C# // Import extension methods in PagedListCreationHelper class. using Sakura.AspNetCore; var pageNumber = 1; // Note that page number starts from 1 (not zero!) var pageSize = 10; // data is assumed as coming from an EntityFramework DbSet here. Any object with type IEnumerable or IQueryable is supported with different implementations. var data = from i in SportsManageModel.Players select i; // The created IPagedList object, which contains a partial view for the current page, and the paging information. var pagedData = data.ToPagedList(pageSize, pageNumber); ``` **Note:** actually, the content of `IEnumerable` or `IQueryable` may vary if they represent as a unstable source (e.g. the result a query from a database may change when another thread added new data). However, the the `ToPagedList` method always creates a static snapshot from the source at the creation time, which means the all the information of the `IPagedList` (including the total page count and the content of current page) never changes after you created it. If you want to capture a dynamic reference of the source, please see the next section. ### Dynamic Data Paging For advanced scenes, you may try to track the change of the data source. Under such circumstance, you may use `IDynamicPagedList`. Another additional feature of this interface is you can change paging settings (page size and page index) even after you created it and receive data in new page. In order to use create a dynamic paged list, you may use `ToDynamicPagedList` extension method on either `IEnumerable` or `IQueryable` object. ### Async Data Paging Entity Framework provides some extention method to quey data asynchronously (e.g. `ToArrayAsync`). If you would like to take advantage for these async operations, you may add the `Sakura.AspNetCore.PagedList.Async` package into your project, and use `ToPagedListAsync` method to generate `IPagedList` asynchronously. **Note:** it is similar with the `ToPageList` method that the async method also creates snapshot for data source. Async operation on dynamic paged lists is currently not supported, since there is no way to set a property value asynchronously. ## Paged Data Access In MVC Projects, you may pass the paged data source from your controller into your view, and iterates the current pages easily. The following code shows the basic way: ```C# // In MVC Controller public IActionResult MyDataView() { // Code for data source access is omitted here. var pagedData = data.ToPagedList(pageSize, pageNumber); return View(pagedData); } ``` ```C# // In MVC View @model Sakura.AspNetCore.IPagedList @* The TotalCount property of a IPagedList is used to indicate the count of all (non-paged) items. *@ Total Players: @Model.TotalCount
    @* Note: IPagedList implements the enumration for current page. (data not in current page will not be accessed.) *@ @foreach (var i in Model) {
  • @i.Name
  • }
``` *Note: Actually, the `IPagedList` is not related with the MVC platform, which means it can be used in any .NET Core Platform targeted project (Including ASP.NET Core Class Library and ASP.NET Core Web Application).* ## Pager Pager feature is much more complex, since it is related with data handling, HTML generation, and MVC view code writing. The detailed step-by-step configuration is list as following. ### Simple Usage First of all, you need to install the package for MVC pager, you should add the package `Sakura.AspNetCore.Mvc.PagedList` into your `project.json`. And then, for the most simple usage, you may add the following code into your `Startup.cs` file: ```C# // Add the following line at the top area of the file to import extension methods. using Sakura.AspNetCore.Mvc; public void ConfigureServices(IServiceCollection services) { // .. Other configuration codes in you application // Add default bootstrap-styled pager implementation services.AddBootstrapPagerGenerator(options => { // Use default pager options. options.ConfigureDefault(); }); } ``` Next, you should add the `PagerTagHelper` into your view processing pipeline, you may add a new line in the `_ViewImports.cs` like: ```HTML @addTagHelper *, Sakura.AspNetCore.Mvc.PagedList ``` Note the above line will enabled the `` tag for all view pages. If you want to enable it only in a few views, you may add this line to each view file invididually. Finally, in your MVC View (.cshtml) file, use the following code to display a pager. ```HTML ``` **Note: The `` tag must use the self-closing mode. Adding any content to this tag is not supported.** If the model type of your view is just `IPagedList` or any inheritted type, you can even omit the "source" attribute and show a pager like this: ```HTML ``` ### Pager without Source In most cases, your pager source is a value with type of `IPagedList`. The usage of the pager source is shown as above. However sometimes you may want to generate a pager with out a paged list source. In this case, you can use the `current-page` and `total-page` attribute on the tag to generate a static pager as following: ```HTML ``` The above code will generate a pager with 10 pages, and the 3rd page will be current page and displays in an active style. **Note: You must set both `current-page` and `total-page` attribute to generate a static pager. In addition, these 2 attribute cannot be used together with the `source` attribute, otherwise you will receive an error message during the pager generating.** ### ### Generation Result and Partial Generation The default bootstrap style pager generator will generate a `