Blazor 5x - قسمت دهم - مبانی Blazor - بخش 7 - مسیریابی
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۱۲/۱۶ ۱۲:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
@page "/LearnRouting" <h3>Learn Routing</h3>
<li class="nav-item px-3">
<NavLink class="nav-link" href="LearnRouting">
<span class="oi oi-list-rich" aria-hidden="true"></span> Learn Routing
</NavLink>
</li> @page "/LearnRouting" @page "/NewRouting" <h3>Learn Routing</h3>
@page "/LearnRouting"
@page "/NewRouting"
@page "/LearnRouting/{parameter1}"
@page "/LearnRouting/{parameter1}/{parameter2}"
<h3>Learn Routing</h3>
<p>Parameter1: @Parameter1</p>
<p>Parameter2: @Parameter2</p>
@code
{
[Parameter]
public string Parameter1 { set; get; }
[Parameter]
public string Parameter2 { set; get; }
}
@page "/LearnAdvancedRouting" <h3>Learn Advanced Routing</h3>
<NavLink class="btn btn-secondary" href="LearnAdvancedRouting">
<span class="oi oi-list-rich" aria-hidden="true"></span> Learn Advanced Routing
</NavLink> <NavLink class="btn btn-secondary" href="LearnAdvancedRouting?param1=value1¶m2=value2">
<span class="oi oi-list-rich" aria-hidden="true"></span> Learn Advanced Routing
</NavLink> @page "/LearnAdvancedRouting"
@inject NavigationManager NavigationManager
<h3>Learn Advanced Routing</h3>
<h4>Parameter 1 : @Param1</h4>
<h4>Parameter 2 : @Param2</h4>
@code
{
string Param1;
string Param2;
protected override void OnInitialized()
{
base.OnInitialized();
var absoluteUri = new Uri(NavigationManager.Uri);
var queryParam = System.Web.HttpUtility.ParseQueryString(absoluteUri.Query);
Param1 = queryParam["Param1"];
Param2 = queryParam["Param2"];
}
}
@page "/LearnAdvancedRouting"
@inject NavigationManager NavigationManager
@*<NavLink href="/learnrouting" class="btn btn-secondary">Back to Routing</NavLink>*@
@*<a href="/learnrouting" class="btn btn-secondary">Back to Routing</a>*@
<button class="btn btn-secondary" @onclick="BackToRouting">Back to Routing</button>
@code
{
private void BackToRouting()
{
NavigationManager.NavigateTo("learnrouting");
}
} <Router
AppAssembly="@typeof(Program).Assembly"
AdditionalAssemblies="new[] { typeof(Component1).Assembly }">
@* ... Router component elements ... *@
</Router> @page "/route/{parameter:datetime}" @page "/"
@inject NavigationManager NavManager
<button @onclick="CurrentTime">Current Time</button>
@code {
public void CurrentTime()
{
NavManager.NavigateTo("/time/" + DateTime.Now);
}
} @page "/time/{param:datetime}"
<h3>Time</h3>
<p>@Param</p>
@code {
[Parameter]
public DateTime Param { get; set; }
} window.getTitle = () => {
return document.title;
}; @page "/"
@inject IJSRuntime jsRuntime
<h2>Page Title: @Title</h2>
<button class="btn btn-primary" @onclick="@GetTitle">Get Title</button>
@code {
public string Title = "";
public async void GetTitle()
{
Title = await jsRuntime.InvokeAsync<string>("getTitle");
}
} @inject IJSRuntime jsRuntime
<button @onclick="NavigateToNewTab">New Tab Navigation</button>
@code {
public async Task NavigateToNewTab()
{
string url = "/counter";
await jsRuntime.InvokeAsync<object>("open", url, "_blank");
}
} NavigationManager.Uri
#> https://localhost:5001/counter/3?q=hi
NavigationManager.BaseUri
#> https://localhost:5001/
NavigationManager.NavigateTo("http://new location")
#> Navigates to new location
NavigationManager.LocationChanged
#> An event that fires when the navigation location has changed.
NavigationManager.ToAbsoluteUri("test")
#> https://localhost:5001/test
NavigationManager.ToBaseRelativePath(MyNavigationManager.Uri)
#> counter/3?q=hi /search?filter=some+stuff&page=3&assignee=User1&assignee=User2
@code {
[Parameter]
[SupplyParameterFromQuery]
public string Filter { get; set; }
[Parameter]
[SupplyParameterFromQuery]
public int? Page { get; set; }
[Parameter]
[SupplyParameterFromQuery(Name = "assignee")]
public string[] Assignees { get; set; }
} String, bool, DateTime, decimal, double, float, Guid, int, long
var actualUri = NavigationManager.GetUriWithQueryParameters(new Dictionary<string, object>
{
["full name"] = "John Doe", // Single value
["ping"] = new int?[] { 35, 16, null, 87, 240 }
}); host/?full%20name=John%20Doe&ping=35&ping=16&ping=87&ping=240
public class MyComponent : ComponentBase
{
public MyComponent(IMyService myService) { ... }
} var registration = NavigationManager.RegisterLocationChangingHandler(async cxt =>
{
if (cxt.TargetLocation.EndsWith("counter"))
{
cxt.PreventNavigation();
}
}); <NavigationLock OnBeforeInternalNavigation="ConfirmNavigation" ConfirmExternalNavigation />
<EditForm EditContext="editContext" OnValidSubmit="Submit">
...
</EditForm>
<NavigationLock OnBeforeInternalNavigation="ConfirmNavigation" ConfirmExternalNavigation />
@code {
private readonly EditContext editContext;
...
// Called only for internal navigations.
// External navigations will trigger a browser specific prompt.
async Task ConfirmNavigation(LocationChangingContext context)
{
if (editContext.IsModified())
{
var isConfirmed = await JS.InvokeAsync<bool>("window.confirm",
"Are you sure you want to leave this page?");
if (!isConfirmed)
{
context.PreventNavigation();
}
}
}
} یک نکتهی تکمیلی: امکان تعریف مسیریابی صفحات، با استفاده از ویژگی Route
عموما مسیریابیهای صفحات Blazor، به صورت زیر تعریف میشوند:
@page "/counter"
و اگر نیاز باشد تا این مسیر را در قسمتهای دیگری هم ذکر کنیم (برای مثال در لینکها و یا متد NavigateTo)، باید دقیقا همین مسیر و عبارت را در چندین قسمت برنامه تکرار کنیم. برای رفع این مشکل، با استفاده از ویژگی Route میتوان مسیریابی فوق را به صورت زیر بازنویسی کرد:
@attribute [Route(Constants.CounterRoute)]
در این حالت میتوان از مزیت تعریف مسیر مدنظر به صورت یک ثابت، به صورت زیر استفاده کرد:
public static class Constants
{
public const string CounterRoute = "/counter";
}و اگر در قسمت دیگری از برنامه نیاز به ارجاعی به آن بود، میتوان همین رشتهی ثابت را مجددا مورد استفاده قرار داد:
NavigationManager.NavigateTo(Constants.CounterRoute);