在我的数据库中,我有一个名为control_id的列,其值为1,2,3,4。基于此值,我必须生成文本框,下拉列表和复选框等控件。 (例如,如果我的control_id为1,则必须生成文本框,并为2,下拉列表等)我对MVC完全不熟悉。任何人都可以指出我正确的方向来实现这种情况吗?
答案 0 :(得分:6)
为控件类型创建枚举
public enum ControlTypes
{
TextBox = 1,
Dropdown = 2,
CheckBox = 3,
Label = 4
// Define other control types
}
创建用于处理所有控件类型的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
}
为每个控件创建一个视图模型,现在用于文本框
// 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; }
}
为每个控件创建一个视图模型,此处为下拉列表。
public class DropdownViewModel : DynamicControlsBase
{
public override string FieldLabel { get; set; }
public override List<SelectListItem> ValueList
{
get
{
return base.ValueList;
}
set
{
base.ValueList = value;
}
}
}
现在创建一个名为&#39; EditorTemplates&#39;的文件夹。在视图&gt;&gt;共享。
在该文件夹中为每个视图模型(文本框和下拉列表等)创建一个视图,其名称与ViewModel ex相同。 TextBoxViewModel.cshtml,对下拉列表和其他控件执行相同的操作。
@model MVCSample.Models.TextBoxViewModel
@Html.TextBoxFor(m => m.ControlValue)
在控制器操作方法中为每个相应的视图模型分配值,如下所示,并将其传递给视图。
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"
}
}
};
在实际视图中,使用html helper&#39; EditorFor&#39;,
渲染控件@Html.EditorFor(m => m.DynamicControlsBase)
在控制器中将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();
}