根据MVC4模型价值创造的控制 [英] Control creation based on model value in MVC4

查看:98
本文介绍了根据MVC4模型价值创造的控制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的数据库,我有一个名为CONTROL_ID列其中包括1,2,3,4值。在此基础上的价值,我不得不产生这样文本框,DROPDOWNLIST和检查框控件。
(例如,如果我是CON​​TROL_ID 1,具有生成文本框​​,2,DropDownList的等等),我完全新的MVC。任何人都可以点我在正确的方向实现该场景?


解决方案

  1. 创建控制类型的枚举


 公开枚举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?

    解决方案

    1. Create an enum for control types

    public enum ControlTypes  
    {
        TextBox  = 1,
        Dropdown = 2,
        CheckBox = 3,
        Label = 4
        // Define other control types  
    }
    

    1. 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
    
    }
    

    1. 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;
        } 
     }
    

    1. 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;
            }
        }
    }
    

    1. Now create a folder 'EditTemplates' under Views>>Shared.
    2. 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)
    

    1. 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"
                   }
              }
         };
    

    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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆