ASP.NET Core 3.1 MVC无JS实现错误时统一修改页面标题
解决方案
你可以通过两种集中化的方式实现需求,无需在每个页面重复编写逻辑:
方案一:在共享错误摘要部分视图中处理(符合你的预期场景)
这种方式将标题修改逻辑和错误摘要绑定在一起,仅在渲染错误摘要时调整标题:
- 移除所有视图页面中的重复逻辑:删除每个视图里手动修改标题的代码块,只保留
ViewData["Title"]的初始化:
@page @model SampleModel @{ ViewData["Title"] = "What do you do?"; } <partial name="_ErrorSummary" model="ModelState" />
- 修改
_ErrorSummary.cshtml:添加前缀时检查是否已存在,避免重复添加:
@model Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary @if (!Model.IsValid) { var currentTitle = ViewData["Title"]?.ToString() ?? string.Empty; // 防止重复添加前缀 if (!currentTitle.StartsWith("Error: ")) { ViewData["Title"] = $"Error: {currentTitle}"; } <div class="govuk-error-summary" aria-labelledby="error-summary-title" role="alert" data-module="error-summary"> <h2 class="govuk-error-summary__title" id="error-summary-title"> There is a problem </h2> <div class="govuk-error-summary__body"> <ul class="govuk-list govuk-error-summary__list"> @foreach (var modelError in Model) { var errorField = modelError.Key; foreach (var error in modelError.Value.Errors) { <li> <a href="#@errorField">@error.ErrorMessage</a> </li> } } </ul> </div> </div> }
注意:确保每个视图先设置
ViewData["Title"],再渲染_ErrorSummary,这样部分视图才能正确获取并修改标题。
方案二:直接在布局页_Layout.cshtml中处理(更简洁的集中方式)
将逻辑完全集中在布局页,无需修改任何视图或部分视图:
修改_Layout.cshtml中的标题渲染逻辑,直接判断ModelState状态并添加前缀:
@if (ViewData["Title"] != null) { var pageTitle = ViewData["Title"].ToString(); // 检查ModelState是否存在错误,动态添加前缀 if (!ViewData.ModelState.IsValid) { pageTitle = $"Error: {pageTitle}"; } <title> @pageTitle - Sample Application </title> }
这种方式的优势是:所有页面只要设置了ViewData["Title"],就会自动在验证失败时添加错误前缀,无需额外编写任何视图逻辑。
内容的提问来源于stack exchange,提问作者matrixnew
相关产品推荐
相关产品推荐

