根据MVC4模型价值创造的控制 [英] Control creation based on model value in MVC4
问题描述
在我的数据库,我有一个名为CONTROL_ID列其中包括1,2,3,4值。在此基础上的价值,我不得不产生这样文本框,DROPDOWNLIST和检查框控件。
(例如,如果我是CONTROL_ID 1,具有生成文本框,2,DropDownList的等等),我完全新的MVC。任何人都可以点我在正确的方向实现该场景?
- 创建控制类型的枚举
公开枚举ControlTypes
{
文本框= 1,
下拉= 2,
复选框= 3,
标签= 4
//定义其他控制类型
}
块引用><醇开始=2>处理所有控件类型创建基类。 公共类DynamicControlsBase
{
公共虚拟字符串FieldLabel {搞定;组; } 公共字符串ControlValue {搞定;组; }
//对于下拉
公共虚拟目录&LT; SelectListItem&GT; ValueList {搞定;组; } //同样实现所需的其他属性,控制使用}
块引用><醇开始=3>创建一个视图模型为每个控件,现在对于文本框 //文本框类派生
公共类TextBoxViewModel:DynamicControlsBase
{
公众覆盖字符串FieldLabel
{
得到
{
返回base.FieldLabel;
}
组
{
base.FieldLabel =价值;
}
}公共覆盖列表&LT; SelectListItem&GT; ValueList
{
得到
{
返回base.ValueList;
}
组
{
base.ValueList =价值;
}
}//为标签字段视图模型
公共类LabelViewModel:DynamicControlsBase
{
公众覆盖字符串FieldLabel
{
得到;
组;
}
}
块引用><醇开始=4>的下拉为每个控件创建一个视图模型,在这里。 公共类DropdownViewModel:DynamicControlsBase
{
公众覆盖字符串FieldLabel
{
得到;
组;
} 公共覆盖列表&LT; SelectListItem&GT; ValueList
{
得到
{
返回base.ValueList;
}
组
{
base.ValueList =价值;
}
}
}
块引用>
- 现在,创建一个文件夹EditTemplates下查看>>共享。
- 在为每个视图创建模型的视图(文本框和下拉式等)使用相同的名称作为视图模型前。 TextBoxViewModel.cshtml同样的下拉菜单和其他控件。
@model MVCSample.Models.TextBoxViewModel
@ Html.TextBoxFor(M = GT; m.ControlValue)
块引用>
- 在控制器的操作方法为分配各自视图模型的数值如下图所示,并将其传递给视图。
DynamicControlsBase DCB =新TextBoxViewModel
{
ControlValue =测试
};DCB =新DropdownViewModel
{
ControlValue =测试,
ValueList =新的List&LT; SelectListItem&GT;
{
新SelectListItem
{
文本=测试,
值=1
},
新SelectListItem
{
文本=TEXT,
值=1
}
}
};
块引用><醇开始=8>在实际的视图,使用HTML帮助令控制器EditorFor, @ Html.EditorFor(M = GT; m.DynamicControlsBase)
块引用>在控制器修改getControl方法访问的,
私人DynamicControlsBase GetControl(字符串controlType,DataTable的资料表= NULL,列表与LT; SelectListItem&GT; controlValue = NULL)
{
如果(controlType.Equals(Convert.ToString((int)的ControlTypes.TextBox)))
{
返回新TextBoxViewModel
{
ControlValue = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( 值))。FirstOrDefault()
FieldLabel = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( FieldLabel))。FirstOrDefault()
};
}
否则如果(controlType.Equals(Convert.ToString((int)的ControlTypes.Dropdown)))
{
返回新DropdownViewModel
{
ControlValue = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( 值))。FirstOrDefault()
FieldLabel = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( FieldLabel))。FirstOrDefault(),
ValueList = controlValue
};
}
如果(controlType.Equals(Convert.ToString((int)的ControlTypes.Label)))
{
返回新LabelViewModel
{
ControlValue = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( 值))。FirstOrDefault()
FieldLabel = tableData.AsEnumerable()如(A =&GT; a.Field&下; INT&GT(CONTROL_ID)等于(int.Parse(controlType))。),选择(A =方式&gt; a.Field&所述;串GT;( FieldLabel))。FirstOrDefault()
};
} 返回新DynamicControlsBase();
}In my database, i have a column called control_id which consists value like 1,2,3,4. Based on this value, i have to generate controls like Text box, Dropdownlist and Check box. (For example, if my control_id is 1, has to generate Text box, and for 2, dropdownlist and so on) I am completely new to MVC. Can anyone point me in right direction to implement this scenario?
解决方案
- Create an enum for control types
public enum ControlTypes { TextBox = 1, Dropdown = 2, CheckBox = 3, Label = 4 // Define other control types }
- Create Baseclass for handling all control types.
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 }
- Create a View Model for each control, now for textbox
// 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; } }
- Create a View Model for each control, here for dropdown.
public class DropdownViewModel : DynamicControlsBase { public override string FieldLabel { get; set; } public override List<SelectListItem> ValueList { get { return base.ValueList; } set { base.ValueList = value; } } }
- Now create a folder 'EditTemplates' under Views>>Shared.
- In that create a view for each view model (Textbox and dropdown and more) with the same name as viewModel ex. TextBoxViewModel.cshtml same for dropdown and other controls.
@model MVCSample.Models.TextBoxViewModel @Html.TextBoxFor(m => m.ControlValue)
- In the controller action method assign the value for respective view model like below and pass it to the view.
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" } } };
- In the actual view, render the controls using html helper 'EditorFor',
@Html.EditorFor(m => m.DynamicControlsBase)
In controller modify the GetControl method as,
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(); }
这篇关于根据MVC4模型价值创造的控制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!