Asp.net MVP - 创建动态控件,在哪里?

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

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

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

现在这个列表需要转换成一个表格,每行都有一个标签和控件,但我无法决定在哪里以及如何执行此操作。

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

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

有什么想法吗?

谢谢!

最佳答案

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

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

public class DynamicControlViewModel
{
    public enum ControlTypes
    {
        TextBox,
        DropDown,
        CheckBox
    }

    public string LabelValue { get; set; }
    public ContrlTypes ControlType { get; set; }
}

我的 View 如下所示:

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'
}

View 实现上的属性 setter (后面的 .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();
                }
            }
        }
    }

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

关于Asp.net MVP - 创建动态控件,在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122457/

相关文章:

jquery - 不使用 Zip 文件下载多个文件

webforms - 使用 "Tab"或 "Enter"从 Ajax AutoCompleteExtender 获取值

asp.net - ValidateRequest ="false"在 Asp.Net 4 中不起作用

javascript - 使用 Angularjs $Http.post 的 ASP.NET MVC 4 FormCollection 为空

c# - 获取用户在浏览器中输入的确切网址

java - 将 JMenuItem 传递给 Controller ​​类

java - 匹配类型层次结构

asp.net - 有没有办法在 c# 中查询流,例如。从流对象中选择 *

c# - 获取文本文件中的最后两行

javascript - 模块模式中的 this 关键字?