最佳实践 - 动态控件创建或单独页面?

时间:2014-02-27 23:27:15

标签: asp.net c#-4.0 webforms

我正在尝试决定如何最好地在C#ASP.NET 4.0(最近从3.5开始)Web应用程序中实现对特定进程的增强。如果你在开发过程中实现了类似的东西,我正在寻找最佳实践,也许你自己的见解。

我正在使用的特定流程概述:

  • 用户通过aspx表单创建请求(称为修改请求)以更新设备的某些属性
  • 用户选择的修改类型有关该设备的一些基础信息决定了该设备的哪些属性可以实际更改。

有3组属性最终可以更改(稍微简化但非常准确):

  1. 地址信息(即设备所在的位置 - 城市,州,街道地址等)
  2. 位置坐标(纬度,经度)
  3. 内部公司会计标识符
  4. 根据修改的类型,1 - 3中的元素可以打开进行编辑,只能打开#2中的元素,或仅打开#3。当不能编辑属性时,我不想在禁用的控件中使用它们的值(并且每种类型的修改请求的表单看起来都相同),而是在不可编辑的数据中显示不可编辑的数据。很好的视觉格式。

    因此,当我开始设计解决方案时,我开始着手创建动态控件,思考这个问题:

    Page_Init()
    
    switch (modificationType){
        case 1 : Create one set of controls
        case 2 : Create a different set of controls
        case 3 : Create another set
    }
    

    然后我想在Page_Load()中设置控件的属性值。

    然后我意识到需要在那里实现相同类型的条件语句,因为(例如)一种类型的修改中的街道地址可能需要是TextBox的值,而另一种类型可能需要仅显示在Literal内。

    它似乎开始变得臃肿得相当快,而且根本没有“动态感觉”,我觉得可能因为经验不足而缺少一些东西。我绝对肯定创建3个单独的页面,基本上做同样的事情,略有变化是浪费,当然没有实现良好的设计实践。对这类事情的典型方法的输入将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以创建3个用户控件,每个用户控件都具有只读和编辑模式。 .aspx页面可以使每个控件根据输入加载属性模式。我使用了Bootstrap的标记类。

让我们假设一个包含用户控件所呈现数据的类:

数据

public class Address
{
    public string name { get; set; }
    public string street { get; set; }
    public string number { get; set; }
    public string city { get; set; }
    public string zipcode { get; set; }
    public string phone { get; set; }
}

使用此类的用户控件位于:

address.ascx 文件

<asp:PlaceHolder ID="ReadModePlaceHolder" runat="server">
    <address>
        <strong>
            <asp:Literal ID="NameLiteral" runat="server"></asp:Literal></strong><br />
        <asp:Literal ID="StreetLiteral" runat="server"></asp:Literal><br />
        <asp:Literal ID="CityLiteral" runat="server"></asp:Literal><br />
        <abbr title="Phone">P:</abbr>
        <asp:Literal ID="PhoneLiteral" runat="server"></asp:Literal>
    </address>
</asp:PlaceHolder>
<asp:PlaceHolder ID="EditModePlaceHolder" runat="server">
    <div class="form-horizontal">
        <div class="form-group">
            <label for="<%=NameTextBox.ClientID%>" class="col-sm-2 control-label">Name</label>
            <div class="col-sm-10">
                <asp:TextBox ID="NameTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <label for="<%=StreetTextBox.ClientID%>" class="col-sm-2 control-label">Street</label>
            <div class="col-sm-10">
                <asp:TextBox ID="StreetTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <label for="<%=NumberTextBox.ClientID%>" class="col-sm-2 control-label">Number</label>
            <div class="col-sm-10">
                <asp:TextBox ID="NumberTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <label for="<%=CityTextBox.ClientID%>" class="col-sm-2 control-label">City</label>
            <div class="col-sm-10">
                <asp:TextBox ID="CityTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <label for="<%=ZipCodeTextBox.ClientID%>" class="col-sm-2 control-label">Zip code</label>
            <div class="col-sm-10">
                <asp:TextBox ID="ZipCodeTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <label for="<%=PhoneTextBox.ClientID%>" class="col-sm-2 control-label">Phone</label>
            <div class="col-sm-10">
                <asp:TextBox ID="PhoneTextBox" runat="server"></asp:TextBox>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <asp:Button ID="SubmitButton" runat="server" CssClass="btn btn-default" Text="Submit" />
            </div>
        </div>
    </div>
</asp:PlaceHolder>

address.ascx.cs 档案

protected void Page_Load(object sender, EventArgs e)
{

}

public void LoadReadMode(Address data)
{
    ReadModePlaceHolder.Visible = true;
    EditModePlaceHolder.Visible = false;

    NameLiteral.Text = data.name;
    StreetLiteral.Text = data.number + ", " + data.street;
    CityLiteral.Text = data.city + ", " + data.zipcode;
    PhoneLiteral.Text = data.phone;
}

public void LoadEditMode(Address data)
{
    ReadModePlaceHolder.Visible = false;
    EditModePlaceHolder.Visible = true;

    NameTextBox.Text = data.name;
    StreetTextBox.Text = data.street;
    NumberTextBox.Text = data.number;
    CityTextBox.Text = data.city;
    ZipCodeTextBox.Text = data.zipcode;
    PhoneTextBox.Text = data.phone;
}

在具有此用户控件的.aspx页面中,您可以根据您拥有的数据来调用LoadReadMode(...)LoadEditMode(...)