将 blazor 参数传递给另一个页面
passing blazor parameters to another page
我一直在尝试通过另一个页面传递参数并且这有效,但是我没有得到我想要的,这可能与我传递的内容有关。
我传递的第一件事是名称,但包括空格和特殊字符,我传递的第二件事是网络 link
如何发送:
<div class="col-sm-4">
<h3>Programming</h3>
@if (programming == null)
{
<p><em>Loading...</em></p>
}
else
{
foreach (var program in programming)
{
<a href="/CourseDetails/?name=@program.Name">@program.Name</a>
<br />
}
}
</div>
去向
@page "/CourseDetails"
@using Portfolio.Models;
@using Portfolio_Frontend.Data;
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationHelper
<h3>CourseDetails</h3>
@if (Name == null)
{
<p><em>Loading...</em></p>
}
else
{
<p>@Name</p>
}
@code {
public string Name { get; set; }
protected override void OnInitialized()
{
var uri = NavigationHelper.ToAbsoluteUri
(NavigationHelper.Uri);
if (QueryHelpers.ParseQuery(uri.Query).
TryGetValue("name", out var name))
{
Name = name.First();
}
}
}
我也尝试了参数,现在尝试的查询字符串给出了相同的结果。
在这种特殊情况下它应该传递的名称是:C# Intermediate: 类, Interfaces and OOP
我得到的只是 'C' 我认为是因为它无法翻译 #.
有没有办法传递文字字符串?
去向:https://localhost:5105/CourseDetails/?name=C#%20Intermediate:%20类,%20Interfaces%20and%20OOP
这对我来说似乎是对的。
URL 语法方法的细微修正
你有:
<a href="/CourseDetails/?name=@program.Name">@program.Name</a>
其中 URL 为 /CourseDetails/?name=C#
通常情况下,您会选择其中之一
/CourseDetails/C#
/CourseDetails?name=C#
除此之外,Blazor 未明确支持可选路由参数 (/CourseDetails?name=C#
)
看起来你可以保留可选的查询参数和 fiddle 以及 QueryHelpers.ParseQuery()
我不太相信,但如果你想继续走这条路,请查看这个 post @chris sainty
Link: https://chrissainty.com/working-with-query-strings-in-blazor/
我更愿意创建一个新模型 (DTO),它确切地知道如何以 URL 编码方式为 link 显示 CourseDetails 名称,以及为用户显示名称。
public class ProgramModel
{
private readonly string name;
public ProgramModel(string name)
{
this.name = name;
}
public string DisplayName => name;
public string RelativeUrl => HttpUtility.UrlEncode(name);
}
当我们需要在 'Courses' 页面上呈现 link 时,它看起来像这样:
@page "/courses"
@using BlazorApp1.Data
<div class="col-sm-4">
<h3>Programming</h3>
@foreach (var program in programming)
{
<a href="/CourseDetails/@program.RelativeUrl">@program.DisplayName</a>
<br />
}
</div>
@code {
public IEnumerable<ProgramModel> programming { get; set; }
protected override void OnInitialized()
{
programming = new List<ProgramModel>()
{
new ProgramModel("Rust Things"),
new ProgramModel("JavaScript Things"),
new ProgramModel("C# Things")
};
}
}
最后,当显示 CourseDetails 页面时,我们可以使用最初对字符串进行编码的相同实用程序简单地解码 URL 中的名称,而不是猜测它是否是应用程序的错误,或者浏览器错误“#”没有正确编码为“%23”
@page "/CourseDetails/{Name}"
@inject NavigationManager NavigationHelper
@using System.Web
<h3>CourseDetails</h3>
<p>@HttpUtility.UrlDecode(Name)</p>
@code {
[Parameter]
public string Name { get; set; }
}
我建议放弃在页面之间导航并使用组件的想法:
<div>
@if (SelectedItem is not null)
{
<MyResultsPage SelectedProgramClass=@SelectedItem />
}
</div>
@code
{
ProgramClass SelectedItem {get; set;}
void SomeWayToSelectMyItem(ProgramClass newSelection){
SelectedItem = newSelection;
StateHasChanged();
}
}
然后在你的显示页面中,MyResultsPage.blazor
<div>
<div>@SelectedProgramClass.name</div>
. . .
</div>
@code {
[Parameter]
ProgramClass SelectedProgramClass{get; set;}
}
<MyResultsPage
> 在您为 SelectedProgramClass
.
赋值之前,不会以任何方式出现在客户端上,甚至不会被初始化
我一直在尝试通过另一个页面传递参数并且这有效,但是我没有得到我想要的,这可能与我传递的内容有关。
我传递的第一件事是名称,但包括空格和特殊字符,我传递的第二件事是网络 link
如何发送:
<div class="col-sm-4">
<h3>Programming</h3>
@if (programming == null)
{
<p><em>Loading...</em></p>
}
else
{
foreach (var program in programming)
{
<a href="/CourseDetails/?name=@program.Name">@program.Name</a>
<br />
}
}
</div>
去向
@page "/CourseDetails"
@using Portfolio.Models;
@using Portfolio_Frontend.Data;
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavigationHelper
<h3>CourseDetails</h3>
@if (Name == null)
{
<p><em>Loading...</em></p>
}
else
{
<p>@Name</p>
}
@code {
public string Name { get; set; }
protected override void OnInitialized()
{
var uri = NavigationHelper.ToAbsoluteUri
(NavigationHelper.Uri);
if (QueryHelpers.ParseQuery(uri.Query).
TryGetValue("name", out var name))
{
Name = name.First();
}
}
}
我也尝试了参数,现在尝试的查询字符串给出了相同的结果。 在这种特殊情况下它应该传递的名称是:C# Intermediate: 类, Interfaces and OOP 我得到的只是 'C' 我认为是因为它无法翻译 #.
有没有办法传递文字字符串?
去向:https://localhost:5105/CourseDetails/?name=C#%20Intermediate:%20类,%20Interfaces%20and%20OOP
这对我来说似乎是对的。
URL 语法方法的细微修正
你有:
<a href="/CourseDetails/?name=@program.Name">@program.Name</a>
其中 URL 为 /CourseDetails/?name=C#
通常情况下,您会选择其中之一
/CourseDetails/C#
/CourseDetails?name=C#
除此之外,Blazor 未明确支持可选路由参数 (/CourseDetails?name=C#
)
看起来你可以保留可选的查询参数和 fiddle 以及 QueryHelpers.ParseQuery()
我不太相信,但如果你想继续走这条路,请查看这个 post @chris sainty
Link: https://chrissainty.com/working-with-query-strings-in-blazor/
我更愿意创建一个新模型 (DTO),它确切地知道如何以 URL 编码方式为 link 显示 CourseDetails 名称,以及为用户显示名称。
public class ProgramModel
{
private readonly string name;
public ProgramModel(string name)
{
this.name = name;
}
public string DisplayName => name;
public string RelativeUrl => HttpUtility.UrlEncode(name);
}
当我们需要在 'Courses' 页面上呈现 link 时,它看起来像这样:
@page "/courses"
@using BlazorApp1.Data
<div class="col-sm-4">
<h3>Programming</h3>
@foreach (var program in programming)
{
<a href="/CourseDetails/@program.RelativeUrl">@program.DisplayName</a>
<br />
}
</div>
@code {
public IEnumerable<ProgramModel> programming { get; set; }
protected override void OnInitialized()
{
programming = new List<ProgramModel>()
{
new ProgramModel("Rust Things"),
new ProgramModel("JavaScript Things"),
new ProgramModel("C# Things")
};
}
}
最后,当显示 CourseDetails 页面时,我们可以使用最初对字符串进行编码的相同实用程序简单地解码 URL 中的名称,而不是猜测它是否是应用程序的错误,或者浏览器错误“#”没有正确编码为“%23”
@page "/CourseDetails/{Name}"
@inject NavigationManager NavigationHelper
@using System.Web
<h3>CourseDetails</h3>
<p>@HttpUtility.UrlDecode(Name)</p>
@code {
[Parameter]
public string Name { get; set; }
}
我建议放弃在页面之间导航并使用组件的想法:
<div>
@if (SelectedItem is not null)
{
<MyResultsPage SelectedProgramClass=@SelectedItem />
}
</div>
@code
{
ProgramClass SelectedItem {get; set;}
void SomeWayToSelectMyItem(ProgramClass newSelection){
SelectedItem = newSelection;
StateHasChanged();
}
}
然后在你的显示页面中,MyResultsPage.blazor
<div>
<div>@SelectedProgramClass.name</div>
. . .
</div>
@code {
[Parameter]
ProgramClass SelectedProgramClass{get; set;}
}
<MyResultsPage
> 在您为 SelectedProgramClass
.