This is possible, if you delete the code in the picture in my previous answer from the MyProjectName.IdentityServer
(and other projects) project, you can publish and run it with the Development
environment variable.
But, I cannot recommend publishing the application in the Development
environment because;
In general,it is desirable that the Development
and Production
environment be as similar as possible. However, there are a few fundamental differences. For example, while the UseDeveloperExceptionPage
middleware is requested to work only with the Development
environment variable, the UseErrorPage
middleware is requested to run in the Production
environment. Considering such situations, even if what you want is not recommended, it does not mean that you cannot do it.
Can you share the relevant logs in MyProjectName.HttpApi.Host
and MyProjectName.Web
? And I would be very happy if you could share the details of the request sent over the network.
Hi,
You are probably not running the application in the Production
environment.
Please make sure ASPNETCORE_ENVIRONMENT
is Production
!
The offending piece of code is the following code inside MyProjectNameIdentityServerModule
under MyProjectName.IdentityServer
project. This piece of code is set to run only in Development
environment.
If you want, you can delete this piece of code and publish it again (on Azure or local machine) to make sure this is the problem. I think you will not get error this time.
If you don't get an error, you can fix the problem permanently by setting ASPNETCORE_ENVIRONMENT
to Production
where you run the application.
For more information you can check here.
First of all, I will write down the actions you have done before to be on the same page:
AbpOrganizationUnits
has StateId
State
and you have a property called Name(or a different property).State
entity has ApplicationService
and when you run MyProjectName.HttpApi.Host
project, api end-points appear on swagger.MyProjectName.Web
project, the same api end-points appear on swagger here too. If it is not visible, you need to create a controller in MyProjectName.Web
.I assume you did these steps :)
Then you can customize the ConfigureExtraProperties
method of MyProjectNameModuleExtensionConfigurator
under MyProjectName.Domain.Shared
as in the picture below.
I hope that you will finally see an user interface like the screenshot below:
For more information see here.
Your problem is that OrganizationUnitCreateDto
also doesn't have a State
property. I suspect that you have not configured State
in MyProjectNameModuleExtensionConfigurator
under the MyProjectName.Domain.Shared
project.
Once you do this and you won't need to override the Create and Edit modal. When you run the application, you will be greeted with a picture like the one below:
PS: Make sure that the code in the picture below is in MyProjectNameEfCoreEntityExtensionMappings
under the EntityFrameworkCore
folder in the MyProjectName.EntityFrameworkCore
project and that the property you added in the AbpOrganizationUnits
table of your database is added as a column.
Hi,
I think you can do it by following this document.
I just created a test project and did what you are trying to do by following the document:
Related: https://stackoverflow.com/a/69371513/9922629
Hi,
By following the documents exactly, I was able to reach a screen like the picture below:
If you have had a problem with this, maybe it is related to your abp version
, in this case, if you write your version
information and which UI
you are developing in, I can help more.
By the way, there is sample code
for this in the setting-management
module:
Happy coding 😊
This may be because the version of my application is different from the version of your application.
Could you please delete and recreate the your constructor
?
PS: Don't forget to inject IEmailSender
and ITemplateRenderer
when you recreate constructor
.
If the problem is solved, just close the question 🙂
Happy coding 💻
Hi,
Replace the CustomIdentityUserAppService
I shared in my previous answer with the following code:
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(CustomIdentityUserAppService))]
public class CustomIdentityUserAppService : IdentityUserAppService
{
private const string ToEmail = "info@abp.io";
private readonly IEmailSender _emailSender;
private readonly ITemplateRenderer _templateRenderer;
public CustomIdentityUserAppService(IdentityUserManager userManager, IIdentityUserRepository userRepository, IIdentityRoleRepository roleRepository, IOrganizationUnitRepository organizationUnitRepository, IIdentityClaimTypeRepository identityClaimTypeRepository, IdentityProTwoFactorManager identityProTwoFactorManager, IOptions<IdentityOptions> identityOptions, IDistributedEventBus distributedEventBus, ITemplateRenderer templateRenderer, IEmailSender emailSender)
: base(userManager, userRepository, roleRepository, organizationUnitRepository, identityClaimTypeRepository, identityProTwoFactorManager, identityOptions, distributedEventBus)
{
_templateRenderer = templateRenderer;
_emailSender = emailSender;
}
public override async Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input)
{
var identityUserDto = await base.CreateAsync(input);
var emailBody = await _templateRenderer.RenderAsync("Hello", new HelloModel
{
Name = "John"
});
await _emailSender.SendAsync(
ToEmail,
"ABP Commercial",
emailBody
);
return identityUserDto;
}
}
Then create a folder named Emailing and create the same structure as Emailing folder in the picture below:
Hello.tpl
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
</head>
<body>
hi, {{model.name}}
</body>
</html>
HelloModel.cs
public class HelloModel
{
public string Name { get; set; }
}
MyTemplateDefinitionProvider.cs
public class MyTemplateDefinitionProvider : TemplateDefinitionProvider
{
public override void Define(ITemplateDefinitionContext context)
{
context.Add(
new TemplateDefinition("Hello") //template name: "Hello"
.WithVirtualFilePath(
"/Emailing/Templates/Hello.tpl", //template content path
isInlineLocalized: true
)
);
}
}
Then add the following code in MyProjectName.Application.csproj
:
<ItemGroup>
<EmbeddedResource Include="Emailing\Templates\*.tpl" />
</ItemGroup>
Finally, add the following code inside the ConfigureServices
method in MyProjectNameApplicationModule
:
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<MyProjectNameApplicationModule>("MyProjectName.Emailing");
});
When you add a user, you can find the outgoing mail in the Logs/logs.txt
file (at the bottom of the MyProjectName.HttpApi.Host
project).
For more information, you can refer to the following documents and demo application:
https://community.abp.io/articles/replacing-email-templates-and-sending-emails-jkeb8zzh
https://docs.abp.io/en/abp/latest/Text-Templating#replacing-the-existing-templates
https://docs.abp.io/en/abp/latest/Emailing
https://commercial.abp.io/modules/Volo.TextTemplateManagement
https://github.com/abpframework/abp-samples/tree/master/TextTemplateDemo