diff --git a/docs/en/Blog-Posts/2023-04-17-How-to-Optimize-Your-ASP.NET-Application-for-Improved-Performance/post.md b/docs/en/Blog-Posts/2023-04-17-How-to-Optimize-Your-ASP.NET-Application-for-Improved-Performance/post.md
new file mode 100644
index 0000000000..261621933a
--- /dev/null
+++ b/docs/en/Blog-Posts/2023-04-17-How-to-Optimize-Your-ASP.NET-Application-for-Improved-Performance/post.md
@@ -0,0 +1,118 @@
+# 💻 How to Optimize Your ASP.NET Application for Improved Performance 🚀
+
+If you want your ASP.NET application to perform well, you need to optimize it for speed, responsiveness, and user experience. Performance optimization is critical for factors like fast page load times, improved response efficiency, and happy users. In this article, I'll provide several tips and tricks to help you optimize performance in ASP.NET Core.
+
+## 🚀 Use Response Compression in Your ASP.NET Application
+You can use ASP.NET Core's built-in response compression middleware to compress the response data and reduce the amount of data that needs to be transferred over the network. To use response compression, add the following code to your application's Startup.cs file:
+
+```csharp
+services.AddResponseCompression(options =>
+{
+ options.EnableForHttps = true;
+});
+
+app.UseResponseCompression();
+```
+
+## 🖼️ Optimize Images in Your ASP.NET Application:
+
+Images can be a major contributor to page bloat and slow load times. Here are some tips to optimize images:
+
+🖌️ Use a tool like ImageOptim or Kraken.io to compress and optimize images.
+
+🖼️ Specify the width and height of images in HTML so the browser can allocate space for them before they load.
+
+📝 Use alt attributes to provide descriptive text for images, which can improve accessibility and also help with SEO.
+
+📜 Use lazy loading for images that are below the fold, meaning they're not visible on the initial screen view. You can use libraries like Vanilla LazyLoad to implement lazy loading.
+
+📱 Use responsive images to serve different image sizes to different devices. This can improve page load times by reducing the size of images that are displayed on smaller devices.
+
+💻 Example:
+
+```html
+
+
Loading...
+
+
#### How to Override Branding Component
@@ -219,11 +220,15 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
}
```
+### How to override the favicon
+
+Startup templates contain `favicon.ico` files under the `wwwroot` folder of the Blazor application. You can change this file to override the current favicon.
+
### Breadcrumb Component
On websites that have a lot of pages, **breadcrumb navigation** can greatly **enhance the way users find their way** around. In terms of **usability**, breadcrumbs reduce the number of actions a website **visitor** needs to take in order to get to a **higher-level page**, and they **improve** the **findability** of **website sections** and **pages**.
-
+
#### How to Override the BreadCrumb Component
@@ -241,6 +246,7 @@ On websites that have a lot of pages, **breadcrumb navigation** can greatly **en
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyBreadcrumbsComponent.razor.cs`, in your blazor application as shown below:
+*
```csharp
using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
using Volo.Abp.DependencyInjection;
@@ -260,7 +266,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
Sidebar menus have been used as **a directory for Related Pages** for a **Service** offering, **Navigation** items for a **specific service** or topic and even just as **Links** the user may be interested in.
-
+
#### How to Override the Main Menu Component
@@ -278,6 +284,7 @@ Sidebar menus have been used as **a directory for Related Pages** for a **Servic
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMainMenu.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Navigation;
using Volo.Abp.DependencyInjection;
@@ -315,6 +322,7 @@ Toolbar items are used to add **extra functionality to the toolbar**. The toolba
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyToolbarItemsComponent.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
using Volo.Abp.DependencyInjection;
@@ -334,7 +342,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
Think about a **multi-lingual** website and the first thing that could **hit your mind** is **the language switch component**. A **navigation bar** is a **great place** to **embed a language switch**. By embedding the language switch in the navigation bar of your website, you would **make it simpler** for users to **find it** and **easily** switch the **language** **without trying to locate it across the website.**
-
+
#### How to Override the Language Switch Component
@@ -352,6 +360,7 @@ Think about a **multi-lingual** website and the first thing that could **hit you
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
using Volo.Abp.DependencyInjection;
@@ -371,7 +380,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
The **mobile** **language switch component** is used to switch the language of the website **on mobile devices**. The mobile language switch component is a **dropdown menu** that **contains all the languages** of the website.
-
+
#### How to Override the Mobile Language Switch Component
@@ -389,6 +398,7 @@ The **mobile** **language switch component** is used to switch the language of t
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobilLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
using Volo.Abp.DependencyInjection;
@@ -408,7 +418,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
The **User Menu** is the **menu** that **drops down** when you **click your name** or **profile picture** in the **upper right corner** of your page (**in the toolbar**). It drops down options such as **Settings**, **Logout**, etc.
-
+
#### How to Override the User Menu Component
@@ -426,6 +436,7 @@ The **User Menu** is the **menu** that **drops down** when you **click your name
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyUserMenuComponent.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
using Volo.Abp.DependencyInjection;
@@ -445,7 +456,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
The **mobile user menu component** is used to display the **user menu on mobile devices**. The mobile user menu component is a **dropdown menu** that contains all the **options** of the **user menu**.
-
+
#### How to override the Mobile User Menu Component
@@ -463,6 +474,7 @@ The **mobile user menu component** is used to display the **user menu on mobile
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobileUserMenuComponent.razor.cs`, in your blazor application as shown below:
+
```csharp
using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
using Volo.Abp.DependencyInjection;
diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DatePicker.cshtml b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DatePicker.cshtml
new file mode 100644
index 0000000000..b1c6bd3626
--- /dev/null
+++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/DatePicker.cshtml
@@ -0,0 +1,790 @@
+@page
+@model Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Components.DatePickerModel
+
+@section styles {
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTime DateTime { get; set; }
+
+ public void OnGet()
+ {
+ DateTime = DateTime == default ? DateTime.Now : DateTime;
+ }
+}
+
+
+<abp-date-picker placeholder="New" single-open-and-clear-button="false" week-numbers="Iso" time-picker="true" required today-button-classes="btn-primary" picker-id="testPicker" asp-for="DateTime"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="DateTime">DateTime</label><span> * </span>
+ <abp-date-picker placeholder="New" required="" data-show-i-s-o-week-numbers="true" data-time-picker="true" data-today-button-classes="btn-primary" id="testPicker" data-single-open-and-clear-button="false" data-date="2023-04-12T17:56:33.1115260+03:00">
+ <div class="input-group">
+ <input placeholder="New" required="" type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="clear" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DateTime" data-valmsg-replace="true"></span><input data-date="true" type="hidden" data-val="true" data-val-required="The DateTime field is required." id="DateTime" name="DateTime" value="Wed Apr 12 2023 17:56:33 GMT+0300">
+ </abp-date-picker>
+</div>
+
+
+var newPicker = abp.libs.bootstrapDateRangePicker.createDateRangePicker(
+ {
+ label: "New JavaScript Picker",
+ startDate: "2020-01-01",
+ endDate: "2020-01-02",
+ singleOpenAndClearButton: false,
+ placeholder: "New Picker",
+ });
+
+
+<div class="mb-3">
+ <label class="form-label">New JavaScript Picker</label>
+ <abp-date-range-picker>
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control" placeholder="New Picker">
+ <button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="open">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="clear">
+ <i class="fa fa-times"></i>
+ </button>
+ </div>
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTime StartDate { get; set; }
+
+ [BindProperty]
+ public DateTime EndDate { get; set; }
+
+ public void OnGet()
+ {
+ EndDate = EndDate == default ? DateTime.Now : EndDate;
+ DateTime = DateTime == default ? DateTime.Now : DateTime;
+ }
+}
+
+
+<abp-date-range-picker time-picker="true" asp-for-end="EndDate" asp-for-start="StartDate"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="StartDate">StartDate</label>
+ <abp-date-range-picker data-time-picker="true" data-start-date="0001-01-01T00:00:00.0000000" data-end-date="2023-04-12T18:02:13.2033440+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="StartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="EndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" data-val="true" data-val-required="The StartDate field is required." id="StartDate" name="StartDate" value="Mon Jan 01 0001 00:00:00 GMT+0155"><input data-end-date="true" type="hidden" data-val="true" data-val-required="The EndDate field is required." id="EndDate" name="EndDate" value="Wed Apr 12 2023 18:02:13 GMT+0300">
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTime? NullableDateTime { get; set; }
+}
+
+
+<abp-date-picker auto-update-input="true" today-button-classes="btn-primary" asp-for="NullableDateTime"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="NullableDateTime">NullableDateTime</label>
+ <abp-date-picker data-today-button-classes="btn-primary" data-auto-update-input="true">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary d-none" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="clear" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableDateTime" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="NullableDateTime" name="NullableDateTime" value="2023-04-12">
+ </abp-date-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTime? NullableStartDate { get; set; }
+
+ [BindProperty]
+ public DateTime? NullableEndDate { get; set; }
+}
+
+
+<abp-date-picker auto-update-input="true" today-button-classes="btn-primary" asp-for="NullableDateTime"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="NullableStartDate">NullableStartDate</label>
+ <abp-date-range-picker>
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableStartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableEndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="NullableStartDate" name="NullableStartDate" value=""><input data-end-date="true" type="hidden" id="NullableEndDate" name="NullableEndDate" value="">
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTimeOffset DateTimeDateTimeOffset { get; set; }
+
+ public void OnGet()
+ {
+ DateTimeDateTimeOffset = DateTimeDateTimeOffset == default ? DateTimeOffset.Now : DateTimeDateTimeOffset;
+ }
+}
+
+
+<abp-date-picker auto-update-input="true" today-button-classes="btn-primary" asp-for="DateTimeDateTimeOffset"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="DateTimeDateTimeOffset">DateTimeDateTimeOffset</label>
+ <abp-date-picker data-today-button-classes="btn-primary" data-auto-update-input="true" data-date="2023-04-12T18:10:05.6171150+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary d-none" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="clear" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DateTimeDateTimeOffset" data-valmsg-replace="true"></span><input data-date="true" type="hidden" data-val="true" data-val-required="The DateTimeDateTimeOffset field is required." id="DateTimeDateTimeOffset" name="DateTimeDateTimeOffset" value="2023-04-12">
+ </abp-date-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTimeOffset StartDateTimeOffset { get; set; }
+
+ [BindProperty]
+ public DateTimeOffset EndDateTimeOffset { get; set; }
+
+ public void OnGet()
+ {
+ StartDateTimeOffset = StartDateTimeOffset == default ? DateTimeOffset.Now : StartDateTimeOffset;
+ EndDateTimeOffset = EndDateTimeOffset == default ? DateTimeOffset.Now : EndDateTimeOffset;
+ }
+}
+
+
+<abp-date-range-picker clear-button="false" asp-for-end="EndDateTimeOffset" asp-for-start="StartDateTimeOffset"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="StartDateTimeOffset">StartDateTimeOffset</label>
+ <abp-date-range-picker data-start-date="2023-04-12T18:11:50.9560980+03:00" data-end-date="2023-04-12T18:11:50.9560980+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="StartDateTimeOffset" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="EndDateTimeOffset" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" data-val="true" data-val-required="The StartDateTimeOffset field is required." id="StartDateTimeOffset" name="StartDateTimeOffset" value="Wed Apr 12 2023 18:11:50 GMT+0300"><input data-end-date="true" type="hidden" data-val="true" data-val-required="The EndDateTimeOffset field is required." id="EndDateTimeOffset" name="EndDateTimeOffset" value="Wed Apr 12 2023 18:11:50 GMT+0300">
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTimeOffset DateTimeDateTimeOffset { get; set; }
+}
+
+
+<abp-date-picker auto-update-input="true" today-button-classes="btn-primary" asp-for="NullableDateTimeDateTimeOffset"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="NullableDateTimeDateTimeOffset">NullableDateTimeDateTimeOffset</label>
+ <abp-date-picker data-today-button-classes="btn-primary" data-auto-update-input="true">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary d-none" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="clear" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableDateTimeDateTimeOffset" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="NullableDateTimeDateTimeOffset" name="NullableDateTimeDateTimeOffset" value="2023-04-12">
+ </abp-date-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public DateTimeOffset? NullableStartDateTimeOffset { get; set; }
+
+ [BindProperty]
+ public DateTimeOffset? NullableEndDateTimeOffset { get; set; }
+}
+
+
+<abp-date-range-picker clear-button="false" asp-for-end="NullableEndDateTimeOffset" asp-for-start="NullableStartDateTimeOffset"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="NullableStartDateTimeOffset">NullableStartDateTimeOffset</label>
+ <abp-date-range-picker>
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableStartDateTimeOffset" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="NullableEndDateTimeOffset" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="NullableStartDateTimeOffset" name="NullableStartDateTimeOffset" value=""><input data-end-date="true" type="hidden" id="NullableEndDateTimeOffset" name="NullableEndDateTimeOffset" value="">
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public string StringDate { get; set; }
+}
+
+
+<abp-date-picker auto-update-input="true" today-button-classes="btn-primary" asp-for="StringDate"/>
+
+
+<div class="mb-3">
+ <label class="form-label" for="StringDate">StringDate</label>
+ <abp-date-picker data-today-button-classes="btn-primary" data-auto-update-input="true">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary d-none" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="clear" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-times"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="StringDate" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="StringDate" name="StringDate" value="2023-04-12">
+ </abp-date-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ [BindProperty]
+ public string StringStartDate { get; set; }
+
+ [BindProperty]
+ public string StringEndDate { get; set; }
+}
+
+
+<abp-date-range-picker clear-button="false" asp-for-end="StringEndDate" asp-for-start="StringStartDate"></abp-date-range-picker>
+
+
+<div class="mb-3">
+ <label class="form-label" for="StringStartDate">StringStartDate</label>
+ <abp-date-range-picker>
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="Processing...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="StringStartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="StringEndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="StringStartDate" name="StringStartDate" value=""><input data-end-date="true" type="hidden" id="StringEndDate" name="StringEndDate" value="">
+ </abp-date-range-picker>
+</div>
+
+
+public class DatePickerModel : PageModel
+{
+ public class DynamicForm
+ {
+ [BindProperty]
+ [DateRangePicker("MyPicker",true)]
+ public DateTime StartDate { get; set; }
+
+ [BindProperty]
+ [DateRangePicker("MyPicker",false)]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ public DateTime EndDate { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ public DateTime DateTime { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker2",true)]
+ public DateTime? NullableStartDate { get; set; }
+ [BindProperty]
+ [DateRangePicker("MyPicker2")]
+ public DateTime? NullableEndDate { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ public DateTime? NullableDateTime { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker3",true)]
+ public DateTimeOffset StartDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker3")]
+ public DateTimeOffset EndDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ public DateTimeOffset DateTimeDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker4",true)]
+ public DateTimeOffset? NullableStartDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker4")]
+ public DateTimeOffset? NullableEndDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ public DateTimeOffset? NullableDateTimeDateTimeOffset { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker5",true)]
+ public string StringStartDate { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DateRangePicker("MyPicker5")]
+ public string StringEndDate { get; set; }
+
+ [BindProperty]
+ [DatePickerOptions(nameof(DatePickerOptions))]
+ [DatePicker]
+ public string StringDate { get; set; }
+ }
+
+ public AbpDatePickerOptions DatePickerOptions { get; set; }
+
+ [BindProperty]
+ public DynamicForm DynamicFormExample { get; set; }
+
+ public void OnGet()
+ {
+ DynamicFormExample ??= new DynamicForm
+ {
+ StartDate = DateTime.Now,
+ EndDate = DateTime.Now,
+ DateTime = DateTime.Now,
+
+ StartDateTimeOffset = DateTimeOffset.Now,
+ EndDateTimeOffset = DateTimeOffset.Now,
+ DateTimeDateTimeOffset = DateTimeOffset.Now,
+ };
+
+ DatePickerOptions = new AbpDatePickerOptions();
+ DatePickerOptions.LinkedCalendars = false;
+ DatePickerOptions.Ranges = new List<AbpDatePickerRange>();
+ DatePickerOptions.Ranges.Add(new AbpDatePickerRange("Today", DateTime.Now, DateTime.Now));
+ }
+
+ public void OnPost()
+ {
+ return;
+ }
+}
+
+
+<abp-dynamic-form abp-model="DynamicFormExample">
+</abp-dynamic-form>
+
+
+<form method="post" novalidate="novalidate">
+ <div class="row">
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_StartDate">Start Date - End Date</label>
+ <abp-date-range-picker id="MyPicker" data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}" data-start-date="2023-04-17T15:21:46.6569460+03:00" data-end-date="2023-04-17T15:21:46.6570750+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <ti class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.StartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.EndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" data-val="true" data-val-required="The Start Date - End Date field is required." id="DynamicFormExample_StartDate" name="DynamicFormExample.StartDate" value="Mon Apr 17 2023 15:21:46 GMT+0300"><input data-end-date="true" type="hidden" data-val="true" data-val-required="The EndDate field is required." id="DynamicFormExample_EndDate" name="DynamicFormExample.EndDate" value="Mon Apr 17 2023 15:21:46 GMT+0300">
+ </abp-date-range-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_NullableStartDate">Nullable Start Date - Nullable End Date</label>
+ <abp-date-range-picker id="MyPicker2" data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableStartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableEndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="DynamicFormExample_NullableStartDate" name="DynamicFormExample.NullableStartDate" value=""><input data-end-date="true" type="hidden" id="DynamicFormExample_NullableEndDate" name="DynamicFormExample.NullableEndDate" value="">
+ </abp-date-range-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_StartDateTimeOffset">Start DateTime Offset - End DateTime Offset</label>
+ <abp-date-range-picker id="MyPicker3" data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}" data-start-date="2023-04-17T15:21:46.6573400+03:00" data-end-date="2023-04-17T15:21:46.6574650+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.StartDateTimeOffset" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.EndDateTimeOffset" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" data-val="true" data-val-required="The Start DateTime Offset - End DateTime Offset field is required." id="DynamicFormExample_StartDateTimeOffset" name="DynamicFormExample.StartDateTimeOffset" value="Mon Apr 17 2023 15:21:46 GMT+0300"><input data-end-date="true" type="hidden" data-val="true" data-val-required="The EndDateTimeOffset field is required." id="DynamicFormExample_EndDateTimeOffset" name="DynamicFormExample.EndDateTimeOffset" value="Mon Apr 17 2023 15:21:46 GMT+0300">
+ </abp-date-range-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_NullableStartDateTimeOffset">Nullable Start DateTime Offset - Nullable End DateTime Offset</label>
+ <abp-date-range-picker id="MyPicker4" data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableStartDateTimeOffset" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableEndDateTimeOffset" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="DynamicFormExample_NullableStartDateTimeOffset" name="DynamicFormExample.NullableStartDateTimeOffset" value=""><input data-end-date="true" type="hidden" id="DynamicFormExample_NullableEndDateTimeOffset" name="DynamicFormExample.NullableEndDateTimeOffset" value="">
+ </abp-date-range-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_StringStartDate">String Start Date - String End Date</label>
+ <abp-date-range-picker id="MyPicker5" data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.StringStartDate" data-valmsg-replace="true"></span><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.StringEndDate" data-valmsg-replace="true"></span><input data-start-date="true" type="hidden" id="DynamicFormExample_StringStartDate" name="DynamicFormExample.StringStartDate" value=""><input data-end-date="true" type="hidden" id="DynamicFormExample_StringEndDate" name="DynamicFormExample.StringEndDate" value="">
+ </abp-date-range-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_DateTime">DateTime</label>
+ <abp-date-picker data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}" data-date="2023-04-17T15:21:46.6572040+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.DateTime" data-valmsg-replace="true"></span><input data-date="true" type="hidden" data-val="true" data-val-required="The DateTime field is required." id="DynamicFormExample_DateTime" name="DynamicFormExample.DateTime" value="Mon Apr 17 2023 15:21:46 GMT+0300">
+ </abp-date-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_NullableDateTime">Nullable DateTime</label>
+ <abp-date-picker data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableDateTime" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="DynamicFormExample_NullableDateTime" name="DynamicFormExample.NullableDateTime" value="">
+ </abp-date-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_DateTimeDateTimeOffset">DateTime DateTime Offset</label>
+ <abp-date-picker data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}" data-date="2023-04-17T15:21:46.6575990+03:00">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.DateTimeDateTimeOffset" data-valmsg-replace="true"></span><input data-date="true" type="hidden" data-val="true" data-val-required="The DateTime DateTime Offset field is required." id="DynamicFormExample_DateTimeDateTimeOffset" name="DynamicFormExample.DateTimeDateTimeOffset" value="Mon Apr 17 2023 15:21:46 GMT+0300">
+ </abp-date-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_NullableDateTimeDateTimeOffset">Nullable DateTime DateTime Offset</label>
+ <abp-date-picker data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.NullableDateTimeDateTimeOffset" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="DynamicFormExample_NullableDateTimeDateTimeOffset" name="DynamicFormExample.NullableDateTimeDateTimeOffset" value="">
+ </abp-date-picker>
+ </div>
+ <div class="mb-3">
+ <label class="form-label" for="DynamicFormExample_StringDate">String Date</label>
+ <abp-date-picker data-linked-calendars="false" data-ranges="{"Today":["2023-04-17T15:21:46.6586240+03:00","2023-04-17T15:21:46.6586240+03:00"]}">
+ <div class="input-group">
+ <input type="text" autocomplete="off" class="form-control">
+ <button type="button" tabindex="-1" data-type="clear" class="d-none btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-times"></i>
+ </button>
+ <button type="button" tabindex="-1" data-type="open" class="btn btn-outline-secondary" data-busy-text="İşleniyor...">
+ <i class="fa fa-calendar"></i>
+ </button>
+ </div><span class="text-danger col-auto field-validation-valid" data-valmsg-for="DynamicFormExample.StringDate" data-valmsg-replace="true"></span><input data-date="true" type="hidden" id="DynamicFormExample_StringDate" name="DynamicFormExample.StringDate" value="">
+ </abp-date-picker>
+ </div>
+ </div>
+</form>
+
+