Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVP-创建动态控件,在哪里?_Asp.net_Design Patterns_Asp.net 4.0_Asp.net 3.5_Mvp - Fatal编程技术网

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

Asp.net MVP-创建动态控件,在哪里?,asp.net,design-patterns,asp.net-4.0,asp.net-3.5,mvp,Asp.net,Design Patterns,Asp.net 4.0,Asp.net 3.5,Mvp,所以,我正试图重写一个旧的asp.net应用程序,我想这次我会在MVP中完成它。 该应用程序通过在表格中放置标签和输入字段来显示动态生成的表单 我从模型中得到的是一个实体列表,这些实体描述了应该呈现哪些控件 现在这个列表需要转换成一个表,每行上都有一个标签和控件,但我不能决定在哪里以及如何做 这些是我可以想到的场景,但我不知道根据MVP,哪一个是正确的: 对于每个项目,在演示者中创建一个表格行,并调用View.AddRow(row) 在演示者中创建表格行列表,并调用View.AddRows(l

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

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

现在这个列表需要转换成一个表,每行上都有一个标签和控件,但我不能决定在哪里以及如何做

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

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


谢谢

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; }
}
视图实现(后面的.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();
                }
            }
        }
    }
public IEnumerable dynamicControl
{
设置
{
foreach(值中的DynamicControlViewModel)
{
//在此处建立用户控件。。。。
开关(型号:ControlType)
{
案例DynamicControlViewModel.ControlTypes.TextBox:
//添加文本框
打破
案例DynamicControlViewModel.ControlTypes.DropDown:
//添加下拉列表
打破
案例DynamicControlViewModel.ControlTypes.CheckBox:
//添加复选框
打破
违约:
抛出新ArgumentOutOfRangeException();
}
}
}
}

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

感谢您的回复。与您描述的有一个重要区别,即数据需要转换为控件,因此我不能简单地将其绑定到中继器或其他东西。所以问题是我是否应该在演示者或视图上创建这些控件。我已经用更完整的代码示例更新了我的答案。这就是你想的吗?控件应该是在视图中创建的。如果在演示者中,您必须添加对WebControl的引用,这通常表示事情的耦合过于紧密。好的,那么控制视图上的创建?明白了,谢谢。任何其他观点仍然值得赞赏。是的,在视图中创建控件,但请确保任何用于确定要创建哪些控件的逻辑都应存在于演示者中,即尽量将逻辑排除在视图之外。另一种意见是,如果我上面的代码示例符合您的需要,请将我的答案标记为已接受:-)如果您需要进一步澄清代码示例,请询问。
  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();
                }
            }
        }
    }