2

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

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

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

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

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

有任何想法吗?

谢谢!

4

1 回答 1

3

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();
                }
            }
        }
    }

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

于 2012-08-25T14:38:38.587 回答