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

use*_*029 1 asp.net-mvc-4

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

小智 6

  1. 为控件类型创建枚举

    public enum ControlTypes  
    {
        TextBox  = 1,
        Dropdown = 2,
        CheckBox = 3,
        Label = 4
        // Define other control types  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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; } 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 为每个控件创建一个View Model,这里是下拉列表.

    public class DropdownViewModel : DynamicControlsBase   
    {
        public override string FieldLabel { get; set; }
    
        public override List<SelectListItem> ValueList
        {
            get
            {
                return base.ValueList;
            }
            set
            {
            base.ValueList = value;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在在Views >> Shared下创建一个名为'EditorTemplates'的文件夹.

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

     @model MVCSample.Models.TextBoxViewModel 
     @Html.TextBoxFor(m => m.ControlValue)
    
    Run Code Online (Sandbox Code Playgroud)
  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"
              }
         }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  8. 在实际视图中,使用html helper'EditorFor'渲染控件,

    @Html.EditorFor(m => m.DynamicControlsBase)
    
    Run Code Online (Sandbox Code Playgroud)

在控制器中将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();
}
Run Code Online (Sandbox Code Playgroud)