Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Blazor服务器端不使用modals重新加载导航_Blazor_Blazor Server Side - Fatal编程技术网

在Blazor服务器端不使用modals重新加载导航

在Blazor服务器端不使用modals重新加载导航,blazor,blazor-server-side,Blazor,Blazor Server Side,我正在尝试使用Blazor服务器端构建一个web应用程序。我想提供一个使用modals的无需重新加载的导航系统,这样用户就不必重新加载页面 如果用户直接登录到,将加载主页面,并打开登录模式,url为。 如果用户关闭模式,url将更新,模式将关闭,但不应重新加载 在Blazor有可能吗?据我所知,情态动词必须和调用者在同一页。从我对情态动词的成功经验来看,我有: 用户名 登录-注册 登录/注册表格在这里 它打开一个模式,但不会更新url,也不会在用户登录时打开 我尝试将我的模式放在一个单独的文

我正在尝试使用Blazor服务器端构建一个web应用程序。我想提供一个使用modals的无需重新加载的导航系统,这样用户就不必重新加载页面

如果用户直接登录到,将加载主页面,并打开登录模式,url为。 如果用户关闭模式,url将更新,模式将关闭,但不应重新加载

在Blazor有可能吗?据我所知,情态动词必须和调用者在同一页。从我对情态动词的成功经验来看,我有:


用户名
登录-注册
登录/注册表格在这里

它打开一个模式,但不会更新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“

  • 在导航链接或打开模式的按钮上添加
    Href=“/yourmodal”
    。这将在打开模式文件时更改url。例如:

    <BSNavLink Href="/login" @onclick="@(() => LoginRegisterModal.Show())">
    USERNAME
    </BSNavLink>
    
  • 在此函数中,检查模式是否已关闭,如果已关闭,请调用
    NavigationManager.NavigateTo(“/”,false)
    返回上一页。这将在关闭模式时更改URL

现在,任何打开或关闭的模式都将更新URL,而无需重新加载页面。
原始问题仍然缺少的是何时在模态上着陆。例如,手动导航到
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))">