基于MVC4中模型值的控件创建

时间:2014-10-29 06:51:11

标签: asp.net-mvc-4

在我的数据库中,我有一个名为control_id的列,其值为1,2,3,4。基于此值,我必须生成文本框,下拉列表和复选框等控件。 (例如,如果我的control_id为1,则必须生成文本框,并为2,下拉列表等)我对MVC完全不熟悉。任何人都可以指出我正确的方向来实现这种情况吗?

1 个答案:

答案 0 :(得分:6)

  1. 为控件类型创建枚举

    public enum ControlTypes  
    {
        TextBox  = 1,
        Dropdown = 2,
        CheckBox = 3,
        Label = 4
        // Define other control types  
    }
    
  2. 创建用于处理所有控件类型的Baseclass。

    public class DynamicControlsBase
    {
        public virtual string FieldLabel { get; set; }
    
        public string ControlValue { get; set; }
        // For dropdown
        public virtual List<SelectListItem> ValueList { get; set; }
    
        // Likewise implement the other required property that the control uses
    }
    
  3. 为每个控件创建一个视图模型,现在用于文本框

     // Textbox deriving class    
     public class TextBoxViewModel : DynamicControlsBase 
     {
         public override string FieldLabel
         {
         get
         {
             return base.FieldLabel;
         }
         set
         {
             base.FieldLabel = value;
         }
    }
    
    public override List<SelectListItem> ValueList
    {
        get
        {
            return base.ValueList;
        }
        set
        {
            base.ValueList = value;
        }
    } 
    
    //View model for Label field 
    public class LabelViewModel : DynamicControlsBase 
    {
        public override string FieldLabel { get; set; } 
    }
    
  4. 为每个控件创建一个视图模型,此处为下拉列表。

    public class DropdownViewModel : DynamicControlsBase   
    {
        public override string FieldLabel { get; set; }
    
        public override List<SelectListItem> ValueList
        {
            get
            {
                return base.ValueList;
            }
            set
            {
            base.ValueList = value;
            }
        }
    }
    
  5. 现在创建一个名为&#39; EditorTemplates&#39;的文件夹。在视图&gt;&gt;共享。

  6. 在该文件夹中为每个视图模型(文本框和下拉列表等)创建一个视图,其名称与ViewModel ex相同。 TextBoxViewModel.cshtml,对下拉列表和其他控件执行相同的操作。

     @model MVCSample.Models.TextBoxViewModel 
     @Html.TextBoxFor(m => m.ControlValue)
    
  7. 在控制器操作方法中为每个相应的视图模型分配值,如下所示,并将其传递给视图。

    DynamicControlsBase dcb = new TextBoxViewModel
    {
        ControlValue = "Test"
    };
    
    dcb = new DropdownViewModel
    {
         ControlValue = "Test",
         ValueList = new List<SelectListItem>
         {
              new SelectListItem
              {
                   Text = "Test",
                   Value= "1"
              },
              new SelectListItem
              {
                   Text = "Text",
                   Value= "1"
              }
         }
    };
    
  8. 在实际视图中,使用html helper&#39; EditorFor&#39;,

    渲染控件
    @Html.EditorFor(m => m.DynamicControlsBase)
    
  9. 在控制器中将GetControl方法修改为,

    private DynamicControlsBase GetControl(string controlType, DataTable tableData = null, List<SelectListItem> controlValue = null)
    {
        if (controlType.Equals(Convert.ToString((int)ControlTypes.TextBox)))
        {
            return new TextBoxViewModel
            {
                ControlValue = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("Value")).FirstOrDefault(),
                FieldLabel = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("FieldLabel")).FirstOrDefault()
            };
        }
        else if (controlType.Equals(Convert.ToString((int)ControlTypes.Dropdown)))
        {
            return new DropdownViewModel
            {
                ControlValue = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("Value")).FirstOrDefault(),
                FieldLabel = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("FieldLabel")).FirstOrDefault(),
                ValueList = controlValue
            };
        }
        if (controlType.Equals(Convert.ToString((int)ControlTypes.Label)))
        {
            return new LabelViewModel
            {
                ControlValue = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("Value")).FirstOrDefault(),
                FieldLabel = tableData.AsEnumerable().Where(a => a.Field<int>("Control_id").Equals(int.Parse(controlType))).Select(a => a.Field<string>("FieldLabel")).FirstOrDefault()
            };
        }
    
        return new DynamicControlsBase();
    }