我一直在为博客列表建立一个适当的过滤栏:语言、日期范围、排序和排程与HTMX保持同步。
与往常一样, 最后20%是辣味部分:日期、缓存和“为什么这在当地可行,如果您想要用大量的代码和图表进行深度潜水,请看:
/博客/过滤器的进展和问题
/blog/calendar-days日历概要来自一个小LinkUrlPagnation 保留了当前过滤器( ) (% 1) 。// Server: cache and vary for index
[ResponseCache(Duration = 300, VaryByHeader = "hx-request",
VaryByQueryKeys = new[] { "page", "pageSize", nameof(startDate), nameof(endDate), nameof(language), nameof(orderBy), nameof(orderDir) },
Location = ResponseCacheLocation.Any)]
[OutputCache(Duration = 3600, VaryByHeaderNames = new[] { "hx-request" },
VaryByQueryKeys = new[] { nameof(page), nameof(pageSize), nameof(startDate), nameof(endDate), nameof(language), nameof(orderBy), nameof(orderDir) })]
public async Task<IActionResult> Index(int page = 1, int pageSize = 20, DateTime? startDate = null, DateTime? endDate = null,
string language = MarkdownBaseService.EnglishLanguage, string orderBy = "date", string orderDir = "desc")
{
var posts = await blogViewService.GetPagedPosts(page, pageSize, language: language, startDate: startDate, endDate: endDate);
posts.LinkUrl = Url.Action("Index", "Blog", new { startDate, endDate, language, orderBy, orderDir });
if (Request.IsHtmx()) return PartialView("_BlogSummaryList", posts);
return View("Index", posts);
}
可见度和内容控制
IsHidden:员额现在可以标为隐藏员额(员额)ScheduledPublishDate: 员额可以IsPinned员额:// BlogService now filters appropriately
var now = DateTimeOffset.UtcNow;
postQuery = postQuery.Where(x =>
!x.IsHidden &&
(x.ScheduledPublishDate == null || x.ScheduledPublishDate <= now));
// Pinned posts sorted first on page 1
if (isFirstPage)
{
postQuery = postQuery.OrderByDescending(x => x.IsPinned)
.ThenByDescending(x => x.PublishedDate.DateTime);
}
/blog/date-range新建新设新终点<clear-param>:增加数<clear-param name="startDate">Clear Date</clear-param>
<clear-param all="true" exclude="language">Clear All Filters</clear-param>
new URL(window.location.href)固定固定: 开始于langSelect.addEventListener('change', async function(){
const u = new URL(window.location.href);
u.searchParams.set('language', langSelect.value);
u.searchParams.set('page','1');
const [ob,od] = (orderSelect.value||'date_desc').split('_');
u.searchParams.set('orderBy', ob);
u.searchParams.set('orderDir', od);
if(input._flatpickr && input._flatpickr.selectedDates.length===2){
const [s,e] = input._flatpickr.selectedDates;
u.searchParams.set('startDate', s.toISOString().substring(0,10));
u.searchParams.set('endDate', e.toISOString().substring(0,10));
}
applyNavigation(u);
});
只覆盖更改的参数; 如果 Flatpickr 有选择, 请重新应用它 。
fp.redraw()固定 : 销毁/ 重新创建 开始时的 Flatpickrer, 然后获取可见月份的亮点并调用htmx:afterSwap.; 并重新运行连接
<html class>固定:观察fp.redraw()调和调sequenceDiagram
participant User
participant JS as blog-index.js
participant HT as HTMX
participant S as Server
User->>JS: Change language/order or pick a date range
JS->>JS: Update URLSearchParams, pushState
JS->>HT: htmx.ajax('GET', /blog?...)
HT->>S: GET /blog
S-->>HT: HTML partial (_BlogSummaryList)
HT-->>User: Swap #content
HTMX 页面请求检测pagerequest过滤栏使用自定义
public static bool IsPageRequest(this HttpRequest request)
{
return request.Headers.ContainsKey("pagerequest") &&
request.Headers["pagerequest"] == "true";
}
帮助服务器区分整页负载和部分 HTMX 交换的页眉 :
**这使控制器能够只返回HTMX请求的部分视图和直接导航的完整页面视图。**注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注的注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注注
区域拾取器键盘支持
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.