添加博客日志的实体框架@(+Part @3)+%
您可以在博客文章中找到所有源代码 吉特胡布
将实体框架添加到一个核心项目“.”中
能够找到 & M1 @ 部件 在这里.
能够找到 & M2 @ 部件 在这里.
一. 导言导言 导言 导言 导言
在前几部分中,我们建立了数据库 和我们的博客的上下文: @,;加上了与数据库互动的服务@.。 在这篇文章,我们将详细介绍这些服务现在如何同现有的控制器和视图合作?#.
主计长
校对:Soup
ASP.NET MVC中的胖主计长模式
I MVC 框架是一个好的做法,就是在您的控制器方法中尽量少做点什么.... 这是因为控制器负责处理请求和回覆回复. 它不应该对应用程序的商业逻辑负责.... 这才是模型的责任
@'QFat 控制器@'Q 防弹衣是控制器做太多事的地方 .}这可能导致很多问题,
- 多个动作中的代码重复@: @% 动作应该是一个单一的工作单位@, @ 简单地弹出模型并返回视图\ .} 如果您发现自己在多个动作中重复代码...", 它表示您应该将该代码重新设置为一种单独的方法=.}
- 难以测试的代码@: @% 使用“'äffat控制器” 来测试代码@'你可能使得检测编码变得很困难。 如果该代码不完善,侧重于单一责任,那么尝试通过代码的所有可能的路径将很难做到这一点;如果该代码不能很好地连接到 “-#结构化”,并专注于一个单独的责任".?"
- 难以维护的代码@: @% 当使用“'”和“Kitchen down”建立应用程序时,维护能力是一个关键问题。 “MSK 1 ”和 “Kitchen link”的操作方法很容易导致您和其他开发者使用代码进行更改以打破应用程序的其他部分时,“. ”
- 难以理解的代码 @: 这是开发商的主要关注点 @ . @ 如果您正在用一个大代码库的工程中工作, 如果控制器动作做得太多 @ MPK2 将很难理解它会发生什么?
博客控制器
博客控制器相对简单@.它有“4”主要动作 @(和一个“'compat action_'),
Task<IActionResult> Index(int page = 1, int pageSize = 5)
Task<IActionResult> Show(string slug, string language = BaseService.EnglishLanguage)
Task<IActionResult> Category(string category, int page = 1, int pageSize = 5)
Task<IActionResult> Language(string slug, string language)
IActionResult Compat(string slug, string language)
反过来,这些行动又称为: IBlogService 以获得他们需要的数据. IBlogService 详细内容见 上一个职位.
这些行动如下:
- 校对:Soup
page和pageSize. 这是用于结果的 pagenation_.=%. - @show: 这是个人博客 post@.}它需要
slug员额及language作为参数 @.}THis 是您目前使用的读取此博客 post@.}的方法 - 这是给定分类的博客文章列表@.}
category,page和pageSize作为参数@. @% - 語言@: @% 此顯示某種語言的部落格文章 @ . @ it takes the
slug和language作为参数@. @% - compat: 这是旧博客链接的兼容性动作 @.}这需要时间
slug和language作为参数@. @%
缓缓
中提及的 上一个职位 我们执行 OutputCache 和 ResponseCahce 以缓存博客 posts @. 的结果 这将改善用户体验并减少服务器的负载@.
使用适当的行动装饰器来实施这些设计,该装饰仪指定了用于“行动”的参数@(以及 hx-request 用于 HTMX 请求@). @% Index 我们指定了这些:
[ResponseCache(Duration = 300, VaryByHeader = "hx-request", VaryByQueryKeys = new[] {nameof(page), nameof(pageSize)}, Location = ResponseCacheLocation.Any)]
[OutputCache(Duration = 3600, VaryByHeaderNames = new[] {"hx-request"} ,VaryByQueryKeys = new[] { nameof(page), nameof(pageSize)})]
意见和意见
博客的浏览量相对简单@. @它们大多只是部落格文章列表_,, Views/Blog \ .}主视图是:
_PostPartial.cshtml
这是对一个博客的片面观点, 文章@. @#它在我们内部使用 Post.cshtml 视图.
@model Mostlylucid.Models.Blog.BlogPostViewModel
@{
Layout = "_Layout";
}
<partial name="_PostPartial" model="Model"/>
_BlogSummaryList.cshtml
这是对博客文章列表的部分视图@. @#它在我们内部使用 Index.cshtml 视图以及主页 @.}
@model Mostlylucid.Models.Blog.PostListViewModel
<div class="pt-2" id="content">
@if (Model.TotalItems > Model.PageSize)
{
<pager
x-ref="pager"
link-url="@Model.LinkUrl"
hx-boost="true"
hx-push-url="true"
hx-target="#content"
hx-swap="show:none"
page="@Model.Page"
page-size="@Model.PageSize"
total-items="@Model.TotalItems"
class="w-full"></pager>
}
@if(ViewBag.Categories != null)
{
<div class="pb-3">
<h4 class="font-body text-lg text-primary dark:text-white">Categories</h4>
<div class="flex flex-wrap gap-2 pt-2">
@foreach (var category in ViewBag.Categories)
{
<a hx-controller="Blog" hx-action="Category" hx-push-url="true" hx-get hx-target="#contentcontainer" hx-route-category="@category" href>
<span class="inline-block rounded-full dark bg-blue-dark px-2 py-1 font-body text-sm text-white outline-1 outline outline-green-dark dark:outline-white">@category</span>
</a>
}
</div>
</div>
}
@foreach (var post in Model.Posts)
{
<partial name="_ListPost" model="post"/>
}
</div>
此处使用 _ListPost 部分显示个人博客文章及 呼叫标签助手 允许我们浏览博客posts @.@
_ListPost.cshtml
缩略 _Listpos 部分视图用于显示列表中的个别博客文章@. @}它在列表中被使用 _BlogSummaryList 视图.
@model Mostlylucid.Models.Blog.PostListModel
<div class="border-b border-grey-lighter pb-8 mb-8">
<a asp-controller="Blog" asp-action="Show" hx-boost="true" hx-swap="show:window:top" hx-target="#contentcontainer" asp-route-slug="@Model.Slug"
class="block font-body text-lg font-semibold transition-colors hover:text-green text-blue-dark dark:text-white dark:hover:text-secondary">@Model.Title</a>
<div class="flex space-x-2 items-center py-4">
@foreach (var category in Model.Categories)
{
<a hx-controller="Blog" hx-action="Category" class="rounded-full bg-blue-dark font-body text-sm text-white px-2 py-1 outline outline-1 outline-white" hx-push-url="true" hx-get hx-target="#contentcontainer" hx-route-category="@category" href>@category
</a>
}
@{ var languageModel = (Model.Slug, Model.Languages, Model.Language); }
<partial name="_LanguageList" model="languageModel"/>
</div>
<div class="block font-body text-black dark:text-white">@Model.Summary</div>
<div class="flex items-center pt-4">
<p class="pr-2 font-body font-light text-primary light:text-black dark:text-white">
@Model.PublishedDate.ToString("f")
</p>
<span class="font-body text-grey dark:text-white">//</span>
<p class="pl-2 font-body font-light text-primary light:text-black dark:text-white">
@Model.ReadingTime
</p>
</div>
</div>
@,_#、公布日期和阅读时间的概要@.}
我们也有HTMX各类别和语言的链接标记, 以显示本地化职位及特定类别的职位@. @
我们有两个方法可以使用 HTMX 这里 @ , @ 1, 其中给出了完整的 URL。 一个是 @ I'HTML 仅@ '} \ MS K4\ e.} 不在 URU}).} 这是因为我们想要为分类和语言使用完整 URR *%,}但是我们不需要个人博客的完整 USMK8}( post_.})
<a asp-controller="Blog" asp-action="Show" hx-boost="true" hx-swap="show:window:top" hx-target="#contentcontainer" asp-route-slug="@Model.Slug"
此方法为单个博客日志和使用提供一个完整的 URL hx-boost 请求使用 HTMX @ (@ 这样设置 hx-request 标题到 true).
<a hx-controller="Blog" hx-action="Category" class="rounded-full bg-blue-dark font-body text-sm text-white px-2 py-1 outline outline-1 outline-white" hx-push-url="true" hx-get hx-target="#contentcontainer" hx-route-category="@category" href>@category
</a>
使用 HTMX 标签来获取博客文章的分类@._ hx-controller, hx-action, hx-push-url, hx-get, hx-target 和 hx-route-category 标签,以获得博客文章的分类 hx-push-url 设置为 true 将 URL 推到浏览器历史@.}
也用于我们 Index HTMX 请求的操作方法 @. @%
public async Task<IActionResult> Index(int page = 1, int pageSize = 5)
{
var posts =await blogService.GetPagedPosts(page, pageSize);
if(Request.IsHtmx())
{
return PartialView("_BlogSummaryList", posts);
}
posts.LinkUrl = Url.Action("Index", "Blog");
return View("Index", posts);
}
当它能让我们返回全部视图时, 或只是 HTMX 请求的片面视图@, @ give a @ '} SPAQ' @ like experience.}(像经验一样)
主页面主网页首页
在 HomeController 我们亦提及这些博客服务, 以获得主页“.”的最新部落格文章。 Index 动作方法@. @%
public async Task<IActionResult> Index(int page = 1,int pageSize = 5)
{
var authenticateResult = GetUserInfo();
var posts =await blogService.GetPagedPosts(page, pageSize);
posts.LinkUrl= Url.Action("Index", "Home");
if (Request.IsHtmx())
{
return PartialView("_BlogSummaryList", posts);
}
var indexPageViewModel = new IndexPageViewModel
{
Posts = posts, Authenticated = authenticateResult.LoggedIn, Name = authenticateResult.Name,
AvatarUrl = authenticateResult.AvatarUrl
};
return View(indexPageViewModel);
}
正如你在这里看到的,我们使用 IBlogService 以获得主页的最新博客文章@. @我们也使用 GetUserInfo 获取主页用户信息的方法@. @%
HTMX再次要求回复部分博客文章的观点,
在结论中的结论
在接下来的我们下半期,我们将详细介绍 我们如何使用 IMarkdownBlogService 将数据库与博客文章一起从标记调时文件中弹出@.}这是应用程序的关键部分,因为它允许我们使用标记降时文件来用博客posts @.以显示该数据库