- ABP Framework version: v6.0.1
- UI type: Blazor Server
- DB provider: EF Core
- Exception message and stack trace: No service for type 'Microsoft.Extensions.Localization.IStringLocalizer`1[MyProject.Localization.MyProjectResource]' has been registered.
This is actually the same question as @balessi75 has already asked here: #3862
I want to use my string resources in a DTO (MyProject.Application.Contracts).
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var l = validationContext.GetRequiredService<IStringLocalizer<MyProjectResource>>();
var errorMessage = l["Entity:DocumentType:IsRequired:ValidationText"].Value;
...
return results;
}
Unfortunately, I have not figured out how to register the IStringLocalizer correctly. I have read the mentioned documentation and searched for it, but somehow it doesn't work for me. I always get the following error message:
Unhandled exception rendering component: No service for type 'Microsoft.Extensions.Localization.IStringLocalizer`1[MyProject.Localization.MyProjectResource]' has been registered.
System.InvalidOperationException: No service for type 'Microsoft.Extensions.Localization.IStringLocalizer`1[MyProject.Localization.MyProjectResource]' has been registered.
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at MyProject.Shared.DocumentDependentBase.Validate(ValidationContext validationContext) in
Can you tell me how to register it in my module?
10 Answer(s)
-
0
hi
Can you share a project to reproduce the problem? liming.ma@volosoft.com
-
0
I wanted to make an example project, but there it works. I haven't figured out where the difference is and why it doesn't work in my other project...
-
0
I also have no idea.
-
0
I have now been able to recreate the problem in a test project. I have emailed you the OneDrive download link for the test project.
In order for you to reproduce this, you need to create and save a new test element in my project.
I use the ObjectGraphDataAnnotationsValidator to validate a more complex object (doesn't make sense in the example, of course, but I had to include it since it's probably part of the problem).
Tests.razor (sorry, I had to change the HTML code so I could paste it here):
< EditForm id="CreateTestForm" EditContext="NewTestDataContext"> < ObjectGraphDataAnnotationsValidator /> < ModalHeader> < ModalTitle>@L["NewTest"]</ModalTitle> < CloseButton Clicked="CloseCreateTestModalAsync" /> < /ModalHeader> < ModalBody> < Validation> < Field> < FieldLabel>@L["DocumentName"]</FieldLabel> < TextEdit @bind-Text="@NewTest.Document.DocumentName"> < Feedback> < ValidationError /> < /Feedback> < /TextEdit> < /Field> < ValidationMessage For="() => NewTest.Document.DocumentValidation"></ValidationMessage> < /Validation> < /ModalBody> < ModalFooter> < Button Color="Color.Secondary" Clicked="CloseCreateTestModalAsync"> @L["Cancel"] < /Button> < SubmitButton Form="CreateTestForm" Clicked="CreateTestAsync" /> < /ModalFooter> < /EditForm>
When validating DocumentDto.cs the error happens:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var results = new List<ValidationResult>(); // This is not working when using EditContext !!! var l = validationContext.GetRequiredService<IStringLocalizer<Abp4146Resource>>(); var errorMessage = l["Test:ValidationMessage"].Value; // Do some validation results.Add(new ValidationResult(errorMessage, new[] { nameof(DocumentValidation) })); return results; }
Exception: System.InvalidOperationException: 'No service for type 'Microsoft.Extensions.Localization.IStringLocalizer`1[Abp4146.Localization.Abp4146Resource]' has been registered.'
What I found out: If I don't use the EditContext for the EditForm, but the model, then it works. But in my concrete project I need the EditContext...
This is working:
<EditForm id="CreateTestForm" Model="@NewTest">
This is NOT working:<EditForm id="CreateTestForm" EditContext="NewTestDataContext">
-
0
hi
For blazor
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var results = new List<ValidationResult>(); // This is not working when using EditContext !!! var l = validationContext.GetService<IStringLocalizer<Abp4146Resource>>(); if (l != null) { var errorMessage = l["Test:ValidationMessage"].Value; // Do some validation results.Add(new ValidationResult(errorMessage, new[] { nameof(DocumentValidation) })); } return results; }
-
0
What does that mean exactly? It is not possible with Blazor? If yes, why? Or you have found a bug that you are going to fix?
Because for me your "solution" means that I can't output multilingual validation messages.
-
0
hi
This line doesn't set the
ServiceProvider
ofValidationContext
if (NewTestDataContext.Validate() == false) { return; }
-
0
hi
This line doesn't set the
ServiceProvider
ofValidationContext
if (NewTestDataContext.Validate() == false) { return; }
I know that, but it would be interesting to know how I would have to do it... setting the ServiceProvider.
-
0
You can't. : ( This is designed by blazor.
-
0