我正在尝试决定如何最好地在C#ASP.NET 4.0(最近从3.5开始)Web应用程序中实现对特定进程的增强。如果你在开发过程中实现了类似的东西,我正在寻找最佳实践,也许你自己的见解。
我正在使用的特定流程概述:
有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个单独的页面,基本上做同样的事情,略有变化是浪费,当然没有实现良好的设计实践。对这类事情的典型方法的输入将非常感激。
答案 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(...)
。