【问题标题】:Asp.net MVP - Creating dynamic controls, where?Asp.net MVP - 创建动态控件,在哪里?
【发布时间】:2023-04-04 10:32:02
【问题描述】:

所以,我正在尝试重写一个旧的 asp.net 应用程序,并认为这次我会在 MVP 中这样做。 该应用通过在表格中放置标签和输入字段来显示动态生成的表单。

我从我的模型中得到的是一个实体列表,这些实体描述了应该呈现哪些控件。

现在需要将此列表转换为每行带有标签和控件的表格,但我无法决定在哪里以及如何执行此操作。

这些是我能想到的场景,但我不知道根据 MVP 哪个是正确的:

  • 为每个项目在演示者中创建一个表格行并调用View.AddRow(row)
  • 在presenter中创建表格行列表并调用View.AddRows(list)
  • 对于每个项目调用View.CreateRow(info)

有什么想法吗?

谢谢!

【问题讨论】:

    标签: asp.net design-patterns asp.net-4.0 asp.net-3.5 mvp


    【解决方案1】:

    MVP 模式的关键是分离视图和演示者之间的关注点。演示者只需设置实体列表,数据是否使用 GridView、Repeater 等以表格形式呈现是视图的关注点。

    如果我按照您的描述进行操作,我会使用“视图模型”类作为创建控件的包装器:

    public class DynamicControlViewModel
    {
        public enum ControlTypes
        {
            TextBox,
            DropDown,
            CheckBox
        }
    
        public string LabelValue { get; set; }
        public ContrlTypes ControlType { get; set; }
    }
    

    我的视图如下所示:

    interface IDynamicControlsView
    {
        IEnumerable<DynamicControlViewModel> DynamicControls { set; }
    }
    

    还有主持人:

    // This method would be called within your Presenter
    public override void Initialize()
    {
          _view.DynamicControls = ConvertDataToViewModel(data); // your method to fetch the data would replace 'data'
    }
    

    视图实现的属性设置器(后面的 .ASPX 代码)如下所示:

      public IEnumerable<DynamicControlViewModel> DynamicControls
        {
            set
            {
                foreach (DynamicControlViewModel model in value)
                {
                    // build up user controls here....
                    switch (model.ControlType)
                    {
                        case DynamicControlViewModel.ContrlTypes.TextBox:
                            // add text box
                            break;
                        case DynamicControlViewModel.ContrlTypes.DropDown:
                            // add drop down
                            break;
                        case DynamicControlViewModel.ContrlTypes.CheckBox:
                            // add checkbox
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }
                }
            }
        }
    

    使用视图模型将使单元测试更容易并保持更清晰的关注点分离。

    【讨论】:

    • 感谢您的回复。与您描述的内容有一个重要区别,那就是数据需要转换为控件,因此我不能简单地将其绑定到中继器或其他东西。所以问题是我应该在 Presenter 上还是在 View 上创建这些控件。
    • 我用更完整的代码示例更新了我的答案。是不是你心里想的更多?控件应该是在视图中创建的。如果在您的演示者中您必须添加对 WebControls 的引用,这通常表明事情变得过于紧密。
    • 好的,那么在视图上创建控件?知道了谢谢。任何其他意见仍然非常感谢。
    • 是的,在视图中创建控件,但请确保确定要创建哪些控件的任何逻辑都应该存在于演示器中,即尽量将逻辑排除在视图之外。如果我上面的代码示例符合您的需要,另一种意见是将我的答案标记为已接受:-) 如果您需要进一步说明代码示例,请询问。
    猜你喜欢
    • 2012-12-15
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多