我一直在尝试在我的 webAPI 中使用本地化,但每次我都会遇到这个错误
System.InvalidOperationException:未注册类型“Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory”的服务。
这是我的Program.cs
using Microsoft.OpenApi.Models;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using testeTraducao.Controllers;
using Microsoft.Extensions.Options;
using testeTraducao.Localize;
using testeTraducao.Resources;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddLocalization(opt => opt.ResourcesPath = "Resources");
builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new() { Title = "testeTraducao", Version = "v1" });
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "testeTraducao v1"));
}
app.UseHttpsRedirection();
var supportedCultures = new[]
{
new CultureInfo("en-UK"),
new CultureInfo("pt-BR")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-UK"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseAuthorization();
app.MapControllers();
app.Run();
我看到有些人说要添加
builder.Services.AddMvc();
但是,仍然不起作用,但出现了不同的错误
System.InvalidOperationException: The view 'test' was not found. The following locations were searched:
/Views/Traduzido/test.cshtml
/Views/Shared/test.cshtml
/Pages/Shared/test.cshtml
at Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable`1 originalLocations)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
这里有一些信息:
控制器:
public class TraduzidoController : Controller
{
private readonly IStringLocalizer<SharedResources> _localizador;
public TraduzidoController(IStringLocalizer<SharedResources> localizador)
{
_localizador = localizador;
}
[HttpGet("/traduz")]
public IActionResult Index()
{
return View(_localizador["test"]);
}
}
目标框架:
<TargetFramework>net6.0</TargetFramework>
谢谢
--编辑-- 改成
return Ok(_localizador["test"]);
后还是收不到消息
return View(_localizador["test"]);
表示您正在尝试获取名为 test
的视图,在本例中该视图已本地化。
一定要添加
builder.Services.AddMvc();
,但也要添加到视图文件中,这就是错误所详细说明的内容:
The view 'test' was not found
创建一个根
Views
文件夹,其中有一个 Traduzido
文件夹用于控制器的视图,最后添加一个 test.cshtml
文件来修复错误。
尝试将
builder.Services.AddControllersWithViews();
添加到您的program.cs 文件中。
API控制器继承自ControllerBase。这是一个没有视图支持的控制器
//API Controller
public class YourController:ControllerBase
MVC 控制器继承自 Controller
//MVC Controller
public class YourController:Controller