【问题标题】:How to implement MVVM Light INavigationService in a DotVVM project如何在 DotVVM 项目中实现 MVVM Light INavigationService
【发布时间】:2018-11-15 18:12:20
【问题描述】:

我想在DotVVM项目中实现MVVM LightINavigationService接口;但我不知道该怎么做。我需要实现的最重要的方法是NavigateTo(string pageKey) 方法。

我在我的MasterPage 中使用SpaContentPlaceHolder,我想通过调用NavigateTo 方法来更改SpaContentPlaceHolder 的内容(RouteName)。

【问题讨论】:

    标签: c# navigation mvvm-light dotvvm


    【解决方案1】:

    如果你在视图模型中,你可以打电话给Context.RedirectToRoute("YourRoute", new { Param1 = something })

    如果你想从不同的地方重定向,最简单的方法是创建INavigationService接口并实现它来调用IDotvvmRequestContext上的方法(它已经注册在ASP.NET Core依赖注入容器中):

    public interface INavigationService 
    {
        void NavigateTo(string routeName, object routeParameters);
    }
    
    public class DotvvmNavigationService 
    {
        private IDotvvmRequestContext context;
    
        public DotvvmNavigationService(IDotvvmRequestContext context) {
            this.context = context;
        }
    
        public void NavigateTo(string routeName, object routeParameters) {
            this.context.RedirectToRoute(routeName, routeParameters);
        }
    }
    

    然后,您只需将实现注册为Startup.cs 中的作用域 依赖项,您应该可以在任何需要的地方获取它。

    services.AddScoped<DotvvmNavigationService>();
    

    【讨论】:

    • 我听从了你的指示;但是在this.context.RedirectToRoute(routeName) 方法上,它会抛出一个异常,上面写着“无法访问已处置的对象。对象名称:'IServiceProvider'。”
    • 看起来该方法是从不同的线程或任务中调用的。重定向只能在处理 HTTP 请求的线程上完成。
    • 它现在正在工作。我的方法是异步方法,所以我将其更改为普通的同步方法,它现在可以工作了。非常感谢。
    • 还有一点:它在RedirectToRoute 方法上抛出了DotvvmInterruptRequestExecutionException,我只是取消选中了“抛出此异常时中断”复选框,因为您已经编写了here。再次感谢。
    • 有什么办法可以强制在处理 HTTP 请求的线程上调用 Redirect 方法?例如runOnUiThreadControl.Invoke 方法在Android 和WinForms 中做类似的事情。 DotVVM中有这样的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2015-09-08
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多