none
【MVVM 模式处理异常】如何将异常情况以界面弹窗形式显示出来? RRS feed

  • 问题

  • 如下图代码,这是 Model 层的获取数据的方法,但如果由于某些原因 HttpClient 抛出了一个异常,如何以弹窗的形式告知用户?(比如:【错误:获取数据失败!】)如果我在 catch {} 里直接编写弹窗代码这样不好吧?! Model 直接联系了 View。请问这应该怎么去解决?

    public async Task<string> GetDateAsync()
    {
        string result = String.Empty;
    
        try
        {
            HttpClient httpClient = new HttpClient();
            result = await httpClient.GetStringAsync("uri");
        }
        catch (HttpRequestException)
        {
            
        }
    
        return result;
    }
    2015年9月29日 8:38

答案

  • 你好,

    在我看来MVVM的编程方式,没有硬性的规定你必须要UI跟代码分离,只是说尽量的将View和code的联系减少到最少。你的问题是直接在model中获取数据,然后可能会出现异常,这里你当然可以直接使用MessageBox去显示,没有什么影响。

    而如果你不想这么用,你可以使用mvvm light中的MessageService去处理:

    try
        {
            DoSomethingDangerous();
        }
        catch (Exception ex)
        {
            ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message);
        }
    

    还有一种方式是在你的model中声明一个异常类型的属性,当你捕获异常时可以初始化这个属性值,当然这时候你需要考虑到model和viewmodel之间的通信了,这里你可以使用mvvm light中提供的Messenger去进行model和viewmodel之间的信息传递。

    关于Messenger的使用,你可以参考这个文档: MVVM - Messenger and View Services in MVVM


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年9月30日 6:37
    版主