【问题标题】:Best practice - Dynamic control creation or separate pages?最佳实践 - 动态控件创建或单独页面?
【发布时间】:2014-02-27 23:27:15
【问题描述】:

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

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

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

有 3 组属性最终是可变的(有点简化但非常准确):

  1. 地址信息(即设备所在的位置 - 城市、州、街道地址等)
  2. 位置坐标(纬度、经度)
  3. 公司内部会计标识符

根据修改的类型,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 个单独的页面,这些页面基本上做同样的事情,但有细微的变化是浪费的,而且肯定不会实施良好的设计实践。非常感谢您就此类问题的典型方法提供意见。

【问题讨论】:

  • 如果我理解正确,您有 3 个区域 (1-3) 显示数据,每个区域都有只读模式和编辑模式。因此,根据用户提供的数据,您总共有 6 个“视图”可能会出现或不出现。准确吗?
  • 你是绝对正确的,是的。想到这 3 个集合具有编辑和只读模式,我才刚刚开始意识到......但仍然不确定下一步可能是什么。
  • 在这种情况下,您可以创建 3 个用户控件,每个控件都有一个只读模式和一个编辑模式。 .aspx 页面可以使每个控件根据输入加载属性模式。如果需要我再解释一下,我可以写一个小例子。
  • 我完全明白你要去哪里,我已经为应用程序编写了许多用户控件......以可重复使用的下拉菜单和典型的页眉/页脚/侧边菜单的形式。如果您不介意包含几个街道地址字段的 UserControl 的小示例,那就太好了。编辑模式的文本框和只读的

    标签之类的简单内容。我想我知道这会走向何方,但很高兴看到你的建议。如果你有时间......在此期间,无论如何我都很感兴趣。

标签: asp.net c#-4.0 webforms


【解决方案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(...)

【讨论】:

  • 我真的很喜欢这种方法。非常感谢你的帮助,塔索斯!我会去的。
猜你喜欢
  • 2015-07-23
  • 2013-07-31
  • 2011-12-20
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多