【发布时间】:2019-03-31 13:38:05
【问题描述】:
我通常对在 Razor Pages 中使用某些 C# 返回类型的“为什么”(而不是“如何”)感到困惑。在某些情况下,我理解“为什么”,但不清楚何时应该使用其中一个。我最初的困惑始于异步类型,但现在我明白了。 void 类型也使情况更加复杂,我对它有更好的理解,但还没有完全理解。
我正在研究几种不同的 sn-ps 代码以便更好地掌握,并且可以使用一些有用的解释 - 文档和其他来源并没有真正将它带回家。
某些方法来自某些 DI,并且不一定相关(我认为,据我所知,这是使用一种返回类型而不是另一种返回类型的原因,在这种情况下,我感谢您的解释)。这里有一些不同的 sn-ps,我希望社区可以帮助我更好地理解“为什么”使用一种返回类型而不是另一种(或者我是否应该坚持使用一种类型,因为它不会影响正在做的事情的结果)。
第一:
public void OnGet()
{
ServicesContainer = _helper
.GetRecentContentItemsByContentTypeAsync("Services")
.GetAwaiter()
.GetResult()
.SingleOrDefault();
ServicesList = _helper
.GetRecentContentItemsByContentTypeAsync("Service")
.GetAwaiter()
.GetResult()
.OrderByDescending(c => c.CreatedUtc)
.Take(3);
}
代码本身我理解没有问题 - 它正在检索一个容器并列出里面的项目。我的 Razor 页面只是使用重复的 foreach 循环显示列表项。我也了解代码正在获取此信息,这是最基本的示例。所以我的理解没有问题。
第二:
public async Task OnGetAsync(string projectTitle)
{
Project = _helper
.QueryContentItemsAsync(q => q
.Where(c => c.DisplayText == projectTitle))
.GetAwaiter()
.GetResult()
.SingleOrDefault();
var relatedProjects =
(IEnumerable<string>)Project?
.Content
.Project.RelatedProjects?
.ContentItemIds?.ToObject<string[]>();
if (relatedProjects?.Count() > 0)
{
RelatedProjects = await
_helper.GetContentItemsByIdAsync(relatedProjects);
}
}
上面还检索了一个可能包含项目(RelatedProjects)的“容器”,但在这种情况下,它的做法有点不同,因为除了项目本身之外可能没有任何东西可以列出。但为什么它使用Task 而不仅仅是OnGet?
第三:
public async Task<IActionResult> OnGet()
{
HeaderInfo = await _helper
.GetContentItemByAliasAsync("alias:fullwidth");
return Page();
}
这里只是一个项目。但同样,为什么使用Task 以及为什么在所有其他代码不需要返回页面时使用<IActionResult> 来返回页面?为什么不使用OnGetAsync?
任何项目都没有什么特别之处 - 它们都存储在 CMS 上(例如,它们没有动态变化)。第一个,带有列表项的容器。第二个是具有潜在相关项目的项目(如果它们存在于 CMS 中,但它们不存在)。第三个只是一个项目。
为什么在第一个使用void而不是
提前感谢您分享任何见解。
【问题讨论】:
标签: c# razor razor-pages