在Blazor服务器端不使用modals重新加载导航
我正在尝试使用Blazor服务器端构建一个web应用程序。我想提供一个使用modals的无需重新加载的导航系统,这样用户就不必重新加载页面 如果用户直接登录到,将加载主页面,并打开登录模式,url为。 如果用户关闭模式,url将更新,模式将关闭,但不应重新加载 在Blazor有可能吗?据我所知,情态动词必须和调用者在同一页。从我对情态动词的成功经验来看,我有:在Blazor服务器端不使用modals重新加载导航,blazor,blazor-server-side,Blazor,Blazor Server Side,我正在尝试使用Blazor服务器端构建一个web应用程序。我想提供一个使用modals的无需重新加载的导航系统,这样用户就不必重新加载页面 如果用户直接登录到,将加载主页面,并打开登录模式,url为。 如果用户关闭模式,url将更新,模式将关闭,但不应重新加载 在Blazor有可能吗?据我所知,情态动词必须和调用者在同一页。从我对情态动词的成功经验来看,我有: 用户名 登录-注册 登录/注册表格在这里 它打开一个模式,但不会更新url,也不会在用户登录时打开 我尝试将我的模式放在一个单独的文
用户名
登录-注册
登录/注册表格在这里
它打开一个模式,但不会更新url,也不会在用户登录时打开
我尝试将我的模式放在一个单独的文件中,并在上面设置了一个@page”/login“,但没有成功。
我还检查了如何更改默认的App.razor来实现这一点,但仍然没有成功
有没有办法在blazor中实现这种导航?我想你对blazor服务器应用程序的概念有点误解。。。 一旦您访问为“_Host.cshtml”文件定义的路由enpoint,并在客户端浏览器上加载应用程序,它的行为就像SPA(单页应用程序),从那时起,您在浏览器上观察到的路由就不是真正的http请求,当您从一页更改到另一页时,不会重新加载 也就是说,管理情态动词将是你最小的问题。在blazor上调整身份验证和授权系统非常困难,因为一旦您验证登录页面上的凭据,您就必须导航到主页或根页面,而未经身份验证/授权的用户不应访问该主页或根页面。祝你好运 根据评论 不,我想说的是,你不能直接在浏览器上操作URL。
如果唯一的问题是您希望从一开始就打开模式,那么就创建一个已经打开的模式。您可以使用bootstrap或任何其他css库,但也可以创建一个覆盖层,将其余内容包装到一个div中,并将所有这些放在一个if块中,if块的条件是一个布尔变量,您可以在需要时进行切换(初始化为true),仅此而已。我有一个开源项目和实时站点,也许这段代码可以让您更好地了解如何登录用户,使用Microsoft.AspNetCore.ProtectedBrowserStorage将其保存,然后在用户返回时重新登录(如果他们选择记住密码): 这是BlazorChat的Index.razor的一部分。顶部测试用户是否登录,如果是,则显示用户名和注销按钮。如果没有,则显示登录和加入按钮 底部部分使用我创建的名为ScreenTypeEnum的枚举:
/// <summary>
/// This enum is used to determine which part of the screen is visible at any time
/// </summary>
public enum ScreenTypeEnum : int
{
Main = 0,
Join = 1,
Login = 2
}
@if (HasLoggedInUser)
{
<div class="welcome">Welcome @LoggedInUser.UserName</div>
<button class="greenbutton2">
<span class="moveup4" @onclick="SignOutButton_Click">Sign Out</span>
</button>
}
else
{
<button class="greenbutton2">
<span class="moveup4" @onclick="LoginButton_Click">Login</span>
</button>
<button class="greenbutton3">
<span class="moveup4" @onclick="SignUpButton_Click">Join Free</span>
</button>
}
@if (ScreenType == ScreenTypeEnum.Join)
{
<Join Parent=this></Join>
}
else if (ScreenType == ScreenTypeEnum.Login)
{
<Login Parent=this></Login>
}
else
{
<Chat Parent=this></Chat>
@if (TextHelper.Exists(Message))
{
<div class="message">
@Message
</div>
}
}
//
///此枚举用于确定屏幕的哪个部分在任何时候都可见
///
公共枚举屏幕类型枚举:int
{
Main=0,
Join=1,
登录名=2
}
@if(HasLoggedInUser)
{
欢迎@LoggedInUser.UserName
退出
}
其他的
{
登录
免费加入
}
@if(ScreenType==ScreenTypeEnum.Join)
{
}
else if(ScreenType==ScreenTypeEnum.Login)
{
}
其他的
{
@if(TextHelper.Exists(Message))
{
@信息
}
}
并不是说这是唯一的方法,但这已经为我在几个网站现在的工作
示例使用SQLServerExpress
现场,人数不多:
我正在开发聊天组件,因此任何Blazor站点都可以添加它。我找到了如何在打开或关闭模式时更改url而不重新加载页面。 正如我在问题中所说,我曾经创建情态动词。 以下是复制的步骤:
- 在任何.razor文件中为所需的每个模式添加
@page”/yourmodal“
- 在导航链接或打开模式的按钮上添加
。这将在打开模式文件时更改url。例如:Href=“/yourmodal”
<BSNavLink Href="/login" @onclick="@(() => LoginRegisterModal.Show())"> USERNAME </BSNavLink>
- 在此函数中,检查模式是否已关闭,如果已关闭,请调用
返回上一页。这将在关闭模式时更改URLNavigationManager.NavigateTo(“/”,false)
原始问题仍然缺少的是何时在模态上着陆。例如,手动导航到
https://localhost/login
不会打开登录模式。当我有了解决方案后,我会更新这个答案。我会看一看-你可以直接使用它,也可以查看代码内部,因为它是开源的。blazored模式示例很好,但是url没有修改,也没有办法直接登陆模式。如果用户转到“url/something”,则“/something”的模式应打开。示例中并非如此。您可以使用存储全局状态的单例DI服务(它将是全局的,而不是每个用户,所以如果需要,存储每个用户),指示是否使用模式。以及负责解析“url/某物”中“某物”部分的“url”页面(我读过的内容),全局状态服务用于存储和检索全局变量。我认为这不是我需要的。据我所知,我需要一个中间件将我的请求路由到modals(当时是页面),而无需重新加载页面。如果我很理解你的答案,那么除了制作modals和在打开时更改URL之外,没有什么特别的事情可以做,以实现我的目标。如果我手动更改URL,我还可以检查是否应该打开一个模式,并从代码中打开它。这样的话,我的网站将是一个水疗中心,但有“假路线”的模态。谢谢你的回答!我会
<BSNavLink Href="/login" @onclick="@(() => LoginRegisterModal.Show())">
USERNAME
</BSNavLink>
<BSModal @ref="LoginRegisterModal" IsOpenChanged="@((e) => ModalIsOpenChanged(e))">