2009-08-10 171 views
3

這是控制生成器類...ASP.NET MVC:創建控件動態

public class ControlBuilder 
{ 
    /// <summary> 
    /// Html Control class for controlbuilder Control . 
    /// </summary> 
    protected HTMLControl formControl; 

    /// <summary> 
    /// Html Control class for the label. 
    /// </summary> 
    private HTMLControl labelControl; 


    /// <summary> 
    /// Getting the property for the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public HTMLControl Form 
    { 
     get { return formControl; } 
    } 

    /// <summary> 
    /// Creating a label for the Control. 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public HTMLControl Label 
    { 
     get { return labelControl; } 
    } 

    /// <summary> 
    /// Creating a construtor for the controlbuilder taking in Zero 
    /// arguments it creates a labl for the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 13/8/2009 Created 
    /// </history> 
    public ControlBuilder() { } 

    /// <summary> 
    /// A construtor for the controlbuilder which 
    /// creates a label for the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public ControlBuilder(string labelName) 
    { 
     Label label = new Label(); 
     label.Text = labelName; 
     label.Width= 200; 
     labelControl = new HTMLControl(label); 
    } 


    /// <summary> 
    /// Control build property that is used to biuld the Html 
    /// markup for the created Control. 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public string BuildControl() 
    { 
     this.CreateControl(); 
     this.SetAttribute(); 
     return this.RenderHTML(); 
    } 

    /// <summary> 
    /// Render Html tags for the Control with label . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public string RenderHTML() 
    { 
     return labelControl.RenderHTML() + ": " + formControl.RenderHTML(); 
    } 

    /// <summary> 
    /// Used to Set Attributes for the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 13/8/2009 Created 
    /// </history> 
    protected virtual void SetAttribute() { } 

    /// <summary> 
    /// Used to create the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 13/8/2009 Created 
    /// </history> 
    protected virtual void CreateControl() { } 

    /// <summary> 
    /// A list of all the Controls that will be created during the 
    /// program run . 
    /// </summary> 
    private IList<ControlBuilder> Controls = new List<ControlBuilder>(); 

    /// <summary> 
    /// A property to add Control to the ControlBuilder that are created by 
    /// the user. 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 13/8/2009 Created 
    /// </history> 
    /// <param name="Control">Controls from the controlbuilder class</param> 
    public void AddControl(ControlBuilder Control) 
    { 
     Controls.Add(Control); 
    } 

    /// <summary> 
    /// A property to display the Controls that are created by 
    /// the user. 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 13/8/2009 Created 
    /// </history> 
    public string Display() 
    { 
     string Html = string.Empty; 

     foreach (ControlBuilder builder in Controls) 
     { 
      Html += builder.BuildControl(); 
      Html += "<br /><br />"; 
     } 

     return Html; 
    } 
} 

}

這是我如何建立一個控制

public class TextBoxBuilder : ControlBuilder 
{ 
    /// <summary> 
    /// Creating a web Control textBox. 
    /// </summary> 
    private TextBox textBox; 

    /// <summary> 
    /// Creating an Id to add as an attribute . 
    /// </summary> 
    private string Id; 

    /// <summary> 
    /// Creating an Value to add as an attribute . 
    /// </summary> 
    private string Value; 

    /// <summary> 
    /// Creating a Textbox constructor which takes in LabelName and Id. 
    /// to create a label for the Control. 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    public TextBoxBuilder(string labelName, string id , string value): base(labelName) 
    { 
     this.Id = id; 
     this.textBox = new TextBox(); 
     this.Value = value; 
    } 

    /// <summary> 
    /// Used to Set properties for the Control . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    protected override void SetAttribute() 
    { 
     this.textBox.ID = this.Id; 
     this.textBox.Text = this.Value; 
    } 

    /// <summary> 
    /// Used to create the Control . That is done by calling the HtmlControl class 
    /// which inturn renders the particular Control for us . 
    /// </summary> 
    /// <history> 
    /// [LuckyR] 10/8/2009 Created 
    /// </history> 
    protected override void CreateControl() 
    { 
     this.formControl = new HTMLControl(this.textBox); 
    } 
} 

}

在我的家庭控制器中,我做到了這一點...

 public ActionResult Create() 
     { 
     ///Where i am contacting the linq to sql classs for performing ths operagtion 
     foreach (var control in Rep.GetData(ScreenName)) 
     { 
      string Type = control.Type; 
      string value = null; 
      if (id != Guid.Empty) 
      { 
       value = DataObj.GetValue(control.TableName, control.ControlName, id); 
      } 

      switch (Type) 
      { 
       case ("TextBox"): 
        /// Buliding a textBox box 
        controlbuilder.AddControl(new TextBoxBuilder(control.Field, control.ControlName, value)); 
        break; 

       case ("CheckBox"): 
        /// Bulidig a CheckBox . 
        controlbuilder.AddControl(new CheckBoxBuilder(control.Field, control.ControlName , value)); 
        break; 

       case ("DatePicker"): 
        /// Bulidig a DatePicker . 
        controlbuilder.AddControl(new DatePicker(control.Field, control.ControlName, value)); 
        break; 

       case ("DropDownList"): 
        ///Building a dropdownlist. 
        List<string> list = DataObj.GetDropDownValues(control.Id); 
        controlbuilder.AddControl(new DropDownListBuilder(control.Field, control.ControlName, list,value)); 
        break; 

       case ("TextArea"): 
        /// Building a textBox area . 
        controlbuilder.AddControl(new TextArea(control.Field, control.ControlName , value)); 
        break; 

       default: 
        break; 
      } 
     } 

     return View(controlbuilder); 
     } 

視圖頁面看起來像這樣...

<% using (Html.BeginForm()) 
    {%> 
<fieldset> 
    <legend>Fields</legend> 
    <p> 
     <%= ViewData.Model.Display() %> 
    </p> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
<% } %> 
<div> 
    <%=Html.ActionLink("Back to List", "Index")%> 
</div> 

,因爲我通過我的班級分成認爲我可以用。顯示有檢索的所有數據。

回答

6

ASP.NET MVC中沒有控件的概念。

你有兩個選擇:

  1. 當用戶點擊一個按鈕,你處理的控制器動作這個POST請求,設置某種標誌在你的視圖模型中現在顯示一個文本框,然後返回相同的視圖依次查看該標誌並根據需要生成文本框。這將導致完整的往返,這與WebForms中的回發有些類似。

  2. 你用JavaScript來做到位。您截取按鈕上的單擊事件,並將輸入/ textarea HTML元素注入到文檔結構中。

+0

我認爲在.NET MVC中創建諸如文本框之類的輸入區域會比由於id和控件的問題而導致的webforms更容易。 因此,我認爲第二種解決方案可能是最好的。 – 2009-09-04 09:01:32