2014-10-29 37 views
1

在我的數據庫中,我有一個名爲control_id的列,它包含像1,2,3,4這樣的值。根據這個值,我必須生成諸如文本框,Dropdownlist和複選框之類的控件。 (例如,如果我的control_id是1,必須生成文本框,對於2,dropdownlist等),我對MVC完全陌生。任何人都可以指出我正確的方向來實現這種情況?基於MVC4中模型值的控件創建

回答

5
  1. 創建控件類型

    public enum ControlTypes 
    { 
        TextBox = 1, 
        Dropdown = 2, 
        CheckBox = 3, 
        Label = 4 
        // Define other control types 
    } 
    
  2. 處理所有控件類型創建基類的枚舉。

    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 
    } 
    
  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; } 
    } 
    
  4. 爲每個控制視圖模型下拉創建一個視圖模型,現在,在這裏。

    public class DropdownViewModel : DynamicControlsBase 
    { 
        public override string FieldLabel { get; set; } 
    
        public override List<SelectListItem> ValueList 
        { 
         get 
         { 
          return base.ValueList; 
         } 
         set 
         { 
         base.ValueList = value; 
         } 
        } 
    } 
    
  5. 現在在Views >> Shared下創建一個名爲'EditorTemplates'的文件夾。

  6. 在該文件夾中爲每個視圖模型(文本框和下拉列表等)創建一個視圖,其名稱與ViewModel ex相同。 TextBoxViewModel.cshtml,併爲下拉菜單和其他控件執行相同的操作。

    @model MVCSample.Models.TextBoxViewModel 
    @Html.TextBoxFor(m => m.ControlValue) 
    
  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" 
          } 
        } 
    }; 
    
  8. 在實際的視圖,呈現使用HTML助手 'EditorFor' 對照,

    @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(); 
} 
+0

雅是。我只是試過。但獲得所有控件的Label_field。在Enum類中,爲1,2,3定義了控件類。但對於標籤怎麼定義呢?我正在努力爲每個控件帶上相應的label_field。必須將Profile_field列轉換爲與各個控件的列名稱相同名稱的標籤。請再次給我正確的方向。 – user3793029 2014-11-13 12:45:40

+0

我之前誤解了您的請求,因爲我以爲您想要爲每個控件顯示標籤,如果我現在正在將代碼添加爲新標籤字段,就像其他控件一樣。請參閱最新的答案。 – Venkat 2014-11-13 13:15:32

+0

已更新回答是指您發送lastweek的權利? – user3793029 2014-11-13 13:25:02