У меня есть серверное приложение Blazor в .Net 8. Я изучаю различные варианты навигации внутри своего приложения. Я реализовал это двумя способами - изменив @Body MainLayout с расширением диспетчера навигации для дополнительных данных вокруг него или Index.razor, который является оболочкой для динамического компонента, а внутри динамического я изменю страницы по типу.
Ниже приведены две реализации. Мой вопрос в том, какой путь лучше для моего бизнес-кейса и более прямой для общедоступного приложения, которым будут пользоваться сотни и тысячи пользователей. Что мешает мне выбрать направление диспетчера навигации, так это то, что я не могу легко передать параметры на определенную страницу, на которую я перенаправляюсь (например, входные параметры).
public class NavigationProvider
{
private readonly NavigationManager _navigationManager;
public NavigationProvider(NavigationManager navigationManager)
{
_navigationManager = navigationManager;
}
public StepEnum CurrentStep { get; private set; } = Step.Undefined;
public Dictionary PassedParameters { get; private set; }
public void NavigateTo(OutcomeEnum outcome, Dictionary passedParameters)
{
this.PassedParameters = passedParameters;
StepEnum nextStep = ChooseNextStep(outcome);
this.Navigate(nextStep);
}
private StepEnum ChooseNextStep(OutcomeEnum outcome)
{
StepEnum nextStep = StepEnum.Undefined;
switch (CurrentStep)
{
case StepEnum.Login:
nextStep = StepEnum.Dashboard;
break;
case StepEnum.Dashboard:
nextStep = StepEnum.ExecuteAction;
break;
case StepEnum.ExecuteAction:
nextStep = StepEnum.EndOfUserAction;
break;
default:
nextStep = StepEnum.ErrorPage;
break;
}
return nextStep;
}
private void Navigate(StepEnum nextStep)
{
_navigationManager.NavigateTo(nextStep.ToString());
}
}
public enum OutcomeEnum
{
ErrorInBusinessLogic,
SuccessfulRedirect
}
public enum StepEnum
{
Login,
Dashboard,
ExecuteAction,
EndOfActionExecute,
ErrorPage
}
Я хочу иметь возможность переходить к маршрутам с разным набором параметров и сохранять текущий шаг между экранами. Также на основе результата экрана — успех/ошибка
Я должен знать, куда двигаться: например, в случае успеха на следующем функциональном экране или в случае ошибки перейти на страницу ошибок.
Это способ навигации внутри серверного приложения blazor? Как создать другую модель представления с входными параметрами для каждого экрана и передать ее с помощью навигации?
Еще одна идея, которую я изучаю, — создать оболочку Index.razor для динамического компонента следующим образом:< /p>
Здесь ComponentType — это фактическая страница бритвы, преобразованная в тип, и я могу пропустить диспетчер навигации и просто изменить тип компонента в зависимости от результата на экране. Внутри моего index.razor.cs у меня будет такая функция:
public Type ComponentType { get; set; } = typeof(Login);
public Dictionary ComponentParameters { get; set; }
protected override void OnInitialized()
{
this.ComponentParameters = new Dictionary
{
{ "NavigateRequest", new Action(HandleNavigateRequest) }
};
base.OnInitialized();
}
public void HandleNavigateRequest(NavArgs args)
{
this.ComponentType = args.CurrentStep switch
{
StepEnum.Registration => typeof(Dashboard),
StepEnum.Dashboard=> typeof(ExecuteAction),
StepEnum.ExecuteAction=> typeof(EndOfActionExecute),
_ => this.ComponentType // default case, keeps the current ComponentType unchanged
};
}
и на каждой странице я могу просто отправить index.razor:
[Parameter]
public Action NavigateRequest { get; set; }
public void RequestNavigate()
{
var args = new NavArgs()
{
CurrentStep = StepEnum.Login,
};
this.NavigateRequest.Invoke(args);
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... parameters