在我的数据库中,我有一个名为control_id的列,其值包括1,2,3,4.基于此值,我必须生成文本框,下拉列表和复选框等控件.(例如,如果我的control_id为1,则必须生成文本框,并为2,下拉列表等)我对MVC完全不熟悉.任何人都可以指出我正确的方向来实现这种情况吗?
小智 6
为控件类型创建枚举
public enum ControlTypes
{
TextBox = 1,
Dropdown = 2,
CheckBox = 3,
Label = 4
// Define other control types
}
Run Code Online (Sandbox Code Playgroud)创建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)为每个控件创建一个视图模型,现在用于文本框
// 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)为每个控件创建一个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)现在在Views >> Shared下创建一个名为'EditorTemplates'的文件夹.
在该文件夹中,为每个视图模型(文本框和下拉列表等)创建一个视图,其名称与ViewModel ex相同.TextBoxViewModel.cshtml,并为下拉列表和其他控件执行相同操作.
@model MVCSample.Models.TextBoxViewModel
@Html.TextBoxFor(m => m.ControlValue)
Run Code Online (Sandbox Code Playgroud)在控制器操作方法中,为每个相应的视图模型分配值,如下所示,并将其传递给视图.
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)在实际视图中,使用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)
| 归档时间: |
|
| 查看次数: |
6417 次 |
| 最近记录: |