<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Enis Necipoglu</title>
    <description>The latest articles on DEV Community by Enis Necipoglu (@enisn).</description>
    <link>https://dev.to/enisn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F319095%2F8473ec00-4051-40ba-810f-a019c18b99b7.png</url>
      <title>DEV Community: Enis Necipoglu</title>
      <link>https://dev.to/enisn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/enisn"/>
    <language>en</language>
    <item>
      <title>What is 'graphBuild' in .NET CLI &amp; MsBuild</title>
      <dc:creator>Enis Necipoglu</dc:creator>
      <pubDate>Tue, 29 Jul 2025 05:14:37 +0000</pubDate>
      <link>https://dev.to/enisn/what-is-graphbuild-in-net-cli-msbuild-1h2e</link>
      <guid>https://dev.to/enisn/what-is-graphbuild-in-net-cli-msbuild-1h2e</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Understanding &lt;code&gt;dotnet build&lt;/code&gt; and When to Reach for &lt;code&gt;/graphBuild&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;You've cloned a large repository. The first clean build works perfectly. But after a few tweaks across indirectly referenced projects, something feels... stale. Welcome to the world of &lt;strong&gt;incremental builds&lt;/strong&gt; — and the subtle fixes offered by graph-based dependency resolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 What's the Real Issue?
&lt;/h3&gt;

&lt;p&gt;By default, &lt;code&gt;dotnet build&lt;/code&gt; optimizes for speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It builds only the project you target.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;includes directly referenced projects&lt;/strong&gt;, but may not reliably recompile &lt;strong&gt;indirect dependencies&lt;/strong&gt; — especially if outputs exist in &lt;code&gt;bin/obj&lt;/code&gt; folders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can lead to surprises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You change &lt;code&gt;ProjectC&lt;/code&gt;, which is referenced by &lt;code&gt;ProjectB&lt;/code&gt;, but you're building &lt;code&gt;ProjectA&lt;/code&gt; (which references &lt;code&gt;ProjectB&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Unless &lt;code&gt;dotnet build&lt;/code&gt; detects timestamp or dependency changes perfectly, &lt;code&gt;ProjectC&lt;/code&gt; might not be rebuilt.&lt;/li&gt;
&lt;li&gt;You silently pick up outdated DLLs — and scratch your head over unexpected behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Solution: Precompute the Dependency Graph
&lt;/h3&gt;

&lt;p&gt;MSBuild (and by extension, &lt;code&gt;dotnet build&lt;/code&gt;) supports the &lt;code&gt;/graphBuild&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build YourProject.csproj &lt;span class="nt"&gt;-p&lt;/span&gt;:GraphBuild&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After .NET 5 SDK and MSBuild 16.6 you can even use &lt;code&gt;/graphBuild&lt;/code&gt; or even shorter &lt;code&gt;/graph&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build /graphBuild
&lt;span class="c"&gt;# or&lt;/span&gt;
dotnet build /graph
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;This activates &lt;strong&gt;static graph mode&lt;/strong&gt;, ensuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topological build order&lt;/strong&gt; of all referenced projects (direct and transitive).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable and safe parallel builds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No reliance on dynamic target evaluation&lt;/strong&gt;, which can skip certain steps if conditions don’t trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Especially useful in CI/CD, multi-repo, or cross-solution setups.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 When Is It Critical?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;/graphBuild&lt;/code&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects reference others &lt;strong&gt;outside their solution&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Conditional build logic or custom targets affect dependencies.&lt;/li&gt;
&lt;li&gt;You want to ensure &lt;strong&gt;clean transitive builds&lt;/strong&gt; after codebase changes, even if timestamps aren’t reliable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Example
&lt;/h3&gt;

&lt;p&gt;Let’s say you have this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ProjectA
 └── ProjectB
      └── ProjectC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You update &lt;code&gt;ProjectC&lt;/code&gt; and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build ProjectA.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without graphBuild? Might skip rebuilding &lt;code&gt;ProjectC&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
With graphBuild?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build ProjectA.csproj &lt;span class="nt"&gt;-p&lt;/span&gt;:GraphBuild&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# Or Alt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guaranteed to build all three in correct order.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 Bonus Tip for Local Builds
&lt;/h3&gt;

&lt;p&gt;After switching branches or making manual edits, do this for a clean, graph-aware rebuild:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet clean ProjectA.csproj
dotnet build ProjectA.csproj &lt;span class="nt"&gt;-p&lt;/span&gt;:GraphBuild&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✍️ TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dotnet build&lt;/code&gt; defaults to speed over precision.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p:GraphBuild=true&lt;/code&gt; brings back accuracy in dependency chains.&lt;/li&gt;
&lt;li&gt;Use it for indirect references, cross-solution setups, or clean builds after changes.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>dotnetcore</category>
      <category>csharp</category>
      <category>programming</category>
    </item>
    <item>
      <title>Visual Studio's "Rebuild" vs dotnet CLI — What You Didn't Know</title>
      <dc:creator>Enis Necipoglu</dc:creator>
      <pubDate>Tue, 29 Jul 2025 05:00:02 +0000</pubDate>
      <link>https://dev.to/enisn/visual-studios-rebuild-vs-dotnet-cli-what-you-didnt-know-bo8</link>
      <guid>https://dev.to/enisn/visual-studios-rebuild-vs-dotnet-cli-what-you-didnt-know-bo8</guid>
      <description>&lt;p&gt;If you've used both Visual Studio and the &lt;code&gt;dotnet CLI&lt;/code&gt;, you might’ve noticed something curious: &lt;strong&gt;the CLI has no “rebuild” command&lt;/strong&gt;. Yet Visual Studio offers “Rebuild” front and center. So what’s going on under the hood?&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 What Rebuild Actually Does
&lt;/h2&gt;

&lt;p&gt;Rebuild in Visual Studio is a combination of two steps, executed for each project in the solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean&lt;/strong&gt; — Deletes everything in &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt;, wiping the slate clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; — Compiles the source code from scratch, ignoring any incremental optimizations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures a full regeneration of binaries, which is useful for resolving weird edge cases, stale references, or flaky builds.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Isn’t That Just Clean + Build?
&lt;/h2&gt;

&lt;p&gt;Not exactly. The sequencing matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rebuild&lt;/strong&gt; executes &lt;em&gt;clean + build sequentially per project&lt;/em&gt;, respecting project dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean All + Build All&lt;/strong&gt; might clean everything first, but then build in parallel — potentially leading to race conditions in tightly coupled solutions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This subtle order of operations makes Visual Studio’s rebuild more predictable in certain scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 What About dotnet CLI?
&lt;/h2&gt;

&lt;p&gt;The CLI focuses on speed via &lt;strong&gt;incremental builds&lt;/strong&gt;. While there’s no native &lt;code&gt;rebuild&lt;/code&gt;, you can mimic the behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet clean
dotnet build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or script per-project rebuild logic if you need fine control.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✍️ TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio’s rebuild is a smart clean-build sequence per project.&lt;/li&gt;
&lt;li&gt;dotnet CLI skips this to prioritize speed and modularity.&lt;/li&gt;
&lt;li&gt;Knowing when to use which can save you from hours of puzzling over failed builds.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>programming</category>
      <category>vscode</category>
      <category>csharp</category>
    </item>
    <item>
      <title>You do it wrong! Customizing ABP Login Page Correctly</title>
      <dc:creator>Enis Necipoglu</dc:creator>
      <pubDate>Tue, 27 May 2025 08:19:56 +0000</pubDate>
      <link>https://dev.to/enisn/you-do-it-wrong-customizing-abp-login-page-correctly-l2k</link>
      <guid>https://dev.to/enisn/you-do-it-wrong-customizing-abp-login-page-correctly-l2k</guid>
      <description>&lt;p&gt;One of the most frequently asked questions within the ABP Community is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I change the login page?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer often seems simple, but is it always the correct or most suitable approach for your specific needs? Let's delve into the details. This article will guide you through the recommended ways to customize the login page in the &lt;a href="https://abp.io/" rel="noopener noreferrer"&gt;ABP Framework&lt;/a&gt;, highlighting a common misunderstanding and ensuring you modify the right components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the ABP Login Page
&lt;/h2&gt;

&lt;p&gt;ABP Framework templates include default login functionality provided by the &lt;a href="https://abp.io/docs/latest/modules/account" rel="noopener noreferrer"&gt;Account Module&lt;/a&gt;. When you want to alter the appearance of the login screen, your first thought might be to override components directly from the Account Module. While this seems straightforward, is it what you truly need to achieve?&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing the Login Page or the Account Layout? That's the Question.
&lt;/h2&gt;

&lt;p&gt;In many scenarios, what developers aim to customize is actually the &lt;strong&gt;Account Layout&lt;/strong&gt;, not the core &lt;strong&gt;Login Page&lt;/strong&gt; component itself. It's a subtle but important distinction.&lt;/p&gt;

&lt;p&gt;Consider the following diagram illustrating the relationship between the Login Page and the Account Layout:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvod5g14m0jtca4dd2hd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvod5g14m0jtca4dd2hd.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Login Page&lt;/strong&gt;: This refers specifically to the area containing the login form (e.g., username/email and password fields, login button, "forgot password" link).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Account Layout&lt;/strong&gt;: This encompasses the broader structure surrounding the login form. It includes elements like the header, footer, branding (logo), background, and overall page styling that frames the login form.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Often, your customization goals—such as changing the logo, background color, or the overall page structure around the form—are better addressed by modifying the &lt;strong&gt;Account Layout&lt;/strong&gt;. In fact, you might not need to override any C# or Razor components at all; simple CSS adjustments might suffice.&lt;/p&gt;

&lt;p&gt;This leads to three primary customization options, ordered by complexity and impact:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Use CSS classes to customize the page.&lt;/li&gt;
&lt;li&gt; Override the &lt;strong&gt;Account Layout&lt;/strong&gt; component.&lt;/li&gt;
&lt;li&gt; Override the &lt;strong&gt;Login Page&lt;/strong&gt; component (from the Account module).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's explore each of these.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Customizing with CSS Classes
&lt;/h2&gt;

&lt;p&gt;Each ABP theme (like Basic or LeptonX) applies a specific CSS class to the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; element of its layouts. This is a powerful feature, as it allows you to scope your CSS customizations effectively, even when adding styles to a global file like &lt;code&gt;global-styles.css&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here’s how these layout-specific classes typically appear in the rendered HTML&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hfgo0db098f882yki69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hfgo0db098f882yki69.png" alt="Rendered HTML result of ABP Application layout" width="460" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Application Layout&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3ig5fzdvgpc8it8pkpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3ig5fzdvgpc8it8pkpb.png" alt="Rendered HTML result of ABP Account layout" width="501" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Account Layout&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By leveraging these classes, you can write targeted CSS rules that only affect elements within the account layout (or any other specific layout).&lt;/p&gt;

&lt;p&gt;Here's a practical example of how you might customize the account layout's appearance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* For the Basic Theme */&lt;/span&gt;
&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;203&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;196&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;196&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* slightly reddish white */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/* Or if you're using LeptonX theme */&lt;/span&gt;
&lt;span class="nc"&gt;.lpx-login-bg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;203&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;196&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;196&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* slightly reddish white */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Account Login Card */&lt;/span&gt;
&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* dark gray */&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;480px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Do not change this width like this static value. It's a demo value. */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.lpx-login-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/* Account Login Card End */&lt;/span&gt;


&lt;span class="c"&gt;/* Bootstrap Buttons in Account Layout */&lt;/span&gt;
&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nc"&gt;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nc"&gt;.btn-primary&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nc"&gt;.btn-outline-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nc"&gt;.btn-outline-primary&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.abp-account-layout&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applying such CSS can significantly alter the look and feel, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88hsnpf8d6pzi56f2arx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88hsnpf8d6pzi56f2arx.png" alt="Customized ABP Login page with LeptonX" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This CSS-first approach is often the cleanest and easiest way to achieve visual customizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Overriding the Account Layout Component
&lt;/h2&gt;

&lt;p&gt;If CSS customizations aren't sufficient to meet your structural or more complex visual requirements (e.g., adding new sections, significantly reordering elements around the login form), your next step might be to override the &lt;strong&gt;Account Layout&lt;/strong&gt; component itself.&lt;/p&gt;

&lt;p&gt;The exact steps for this depend on the ABP theme you are using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For the Basic Theme&lt;/strong&gt;: The original &lt;code&gt;Account.cshtml&lt;/code&gt; layout file is open-source and its content can be found directly in the ABP Framework GitHub repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/abpframework/abp/blob/dev/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml" rel="noopener noreferrer"&gt;/Themes/Basic/Layouts/Account.cshtml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;For Commercial Themes (like LeptonX Theme)&lt;/strong&gt;: You'll first need to obtain the theme's source code. You can do this using the &lt;a href="https://abp.io/docs/latest/cli#get-source" rel="noopener noreferrer"&gt;ABP CLI command&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;abp get-source Volo.Abp.LeptonXTheme
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;em&gt;(Or the equivalent package name for the specific theme/version you are using))&lt;/em&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Once you have access to the original layout file's content (either from GitHub or the &lt;code&gt;get-source&lt;/code&gt; command), you can override it by creating a file at the corresponding path in your web project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Basic Theme&lt;/strong&gt; location: &lt;code&gt;/Themes/Basic/Layouts/Account.cshtml&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📂YourProjectName.Web&lt;br&gt;
└── 📂Themes&lt;br&gt;
------└── 📂Basic&lt;br&gt;
------------└── 📂Layouts&lt;br&gt;
------------------└── 📄Account.cshtml&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LeptonX Theme&lt;/strong&gt; location: &lt;code&gt;/Themes/LeptonX/Layouts/Account/Default.cshtml&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📂 YourProjectName.Web&lt;br&gt;
 └── 📂 Theming&lt;br&gt;
-------└── 📂 LeptonX&lt;br&gt;
-----------└── 📂 Layouts&lt;br&gt;
----------------└── 📂 Account&lt;br&gt;
---------------------└── 📄 Default.cshtml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(Always refer to the theme's documentation or source structure for the exact override path.)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By placing your custom &lt;code&gt;Account.cshtml&lt;/code&gt; (or &lt;code&gt;Default.cshtml&lt;/code&gt; for LeptonX) file in these locations, the ABP Framework will use your version instead of the default one. This approach grants you full control to modify the HTML structure of the Account Layout as needed, allowing you to add, remove, or rearrange any content surrounding the core login form.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Overriding the Login Page Component
&lt;/h2&gt;

&lt;p&gt;This option involves changing the actual login form itself (the &lt;code&gt;Login.cshtml&lt;/code&gt; page from the Account Module) and should generally be your last resort, used only when you need to alter the form's internal structure, add new form fields, or change its core behavior in a way that CSS or Layout overrides cannot achieve.&lt;/p&gt;

&lt;p&gt;The login page, with its core form elements and logic, originates from the &lt;strong&gt;Volo.Abp.Account.Web&lt;/strong&gt; module. You can override this specific component by creating a new &lt;code&gt;Login.cshtml&lt;/code&gt; file (and its corresponding &lt;code&gt;Login.cshtml.cs&lt;/code&gt; PageModel if you need to alter the C# logic) in the &lt;code&gt;Pages/Account&lt;/code&gt; folder of your web project.&lt;/p&gt;

&lt;p&gt;The original content for the &lt;code&gt;Login.cshtml&lt;/code&gt; page can be found in the Account Module's source code on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/abpframework/abp/blob/dev/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml" rel="noopener noreferrer"&gt;/Modules/Account/Pages/Login.cshtml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To override it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1)  Create the following folder structure in your &lt;code&gt;.Web&lt;/code&gt; project if it doesn't already exist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2) Create a &lt;code&gt;Login.cshtml&lt;/code&gt; file inside this &lt;code&gt;Account&lt;/code&gt; folder.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📂 YourProjectName.Web&lt;br&gt;
 └── 📂 Pages&lt;br&gt;
------└── 📂 Account&lt;br&gt;
------------└── 📄 Login.cshtml&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3) Copy the content of the &lt;code&gt;Login.cshtml&lt;/code&gt; page and paste it to your new &lt;code&gt;Login.cshtml&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4) Modify these files as needed. You can now change input fields, add new elements directly to the form, or adjust the server-side handling in the PageModel.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember that overriding the Login.cshtml page directly makes you responsible for maintaining compatibility with future updates to the Account Module, as its internal structure or logic might change. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Customize Smartly
&lt;/h2&gt;

&lt;p&gt;Customizing the login experience in ABP Framework is flexible, but it's vital to choose the right approach. Before diving into component overrides, ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;What exactly do I want to change?&lt;/strong&gt; Is it the overall look and feel (branding, colors, background) or the structure of the login form itself?&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Can this be achieved with CSS?&lt;/strong&gt; Often, targeted CSS rules leveraging theme-specific layout classes are sufficient and the least intrusive method. This should be your first consideration for visual tweaks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Do I need to alter the content &lt;em&gt;around&lt;/em&gt; the login form?&lt;/strong&gt; If yes, overriding the &lt;strong&gt;Account Layout&lt;/strong&gt; (e.g., &lt;code&gt;Themes/Basic/Layouts/Account.cshtml&lt;/code&gt; or its LeptonX equivalent) is the correct approach. This gives you control over headers, footers, and surrounding content without touching the core login mechanism.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Do I need to change the login form fields or its core submission logic?&lt;/strong&gt; Only then should you consider overriding the &lt;strong&gt;Login Page&lt;/strong&gt; component itself (e.g., &lt;code&gt;Pages/Account/Login.cshtml&lt;/code&gt;) from the Account Module.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By understanding the distinction between the Account Layout and the Login Page component, you can implement customizations more efficiently, maintainably, and align with the framework's design principles. Start with CSS, then consider Account Layout overrides, and reserve Login Page component overrides for when they are truly necessary. This will save you time and make your application easier to upgrade in the long run.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>dotnet</category>
      <category>abp</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
