【问题标题】:C# handling user interaction in MVCC# 在 MVC 中处理用户交互
【发布时间】:2017-11-08 09:46:15
【问题描述】:

我已经实现了 MVC 模式,并且正在考虑错误处理和捕获用户决定。

我目前的做法是: 为每个决策类型创建一个事件挂钩,并让 GUI 视图(在我的情况下为表单)创建特定的用户交互(如控制台输出或消息框)

我的问题:这似乎有点奇怪,有没有更好的方法来做到这一点? 如果不是,应该如何设计类UserDecission 来处理大多数用户交互情况?

简单示例:视图已注册到AskUser并调用SaveFile()

public class UserDecission
{
    /// <summary>
    /// Asked to the user, might be a placeholder constant, which the gui can make "pretty"(Display a MessageBox to the user)
    /// </summary>
    public string Question { get; set; }
    /// <summary>
    /// return value
    /// </summary>
    public string Answer { get; set; }
}
public interface IModel
{
    void SaveFile(string filename);
    EventHandler<UserDecission> AskUser { get; set; }
}
public class Model : IModel
{
    public EventHandler<UserDecission> AskUser { get; set; }
    public void SaveFile(string filename)
    {
        if (File.Exists(filename))
        {
            UserDecission decission = new UserDecission() { Question = "FileExistsOverwrite" };
            AskUser?.Invoke(this, decission);
            if (!decission.Answer.Equals("Yes"))
                return;
            //... Do the saving here
        }
    }
}

【问题讨论】:

    标签: c# asp.net-mvc error-handling observer-pattern


    【解决方案1】:

    在这种情况下我不会使用EventHandler&lt;T&gt;,因为这在技术上不是一个事件,而是一个自定义委托类型:

    public delegate string UserPromptHandler( string question );
    

    这会让代码看起来更清晰,因为结果实际上是返回给你的,没有不必要的“发送者”等。你也可以强制你的类的用户在类构造函数中提供处理程序是确定你的处理程序存在。

    【讨论】:

    • EventHandler 具有这样的功能,即观察者不需要缓存模型,它可以将发送者转换为 IModel 并检索额外的上下文信息(在更复杂的情况下),但我可以使用自定义替换 string 数据类型的类:public delegate string UserPromptHandler( ComplexClass question );
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2012-03-27
    相关资源
    最近更新 更多