C# ASP.net用户控件和业务实体
我目前正在开发一些用户控件,以便在项目中的多个位置使用它们。一个控件是关于编辑客户地址列表的控件。因为这需要在项目中的几个地方完成,所以我想让它成为一个简单的用户控件。用户控件包含一个中继器控件。默认情况下,中继器显示一个要编辑的地址项。如果需要添加更多地址,用户可以单击按钮添加要输入的其他地址。用户控件应该用于创建新地址以及编辑现有地址。 地址业务实体如下所示:C# ASP.net用户控件和业务实体,c#,.net,asp.net,C#,.net,Asp.net,我目前正在开发一些用户控件,以便在项目中的多个位置使用它们。一个控件是关于编辑客户地址列表的控件。因为这需要在项目中的几个地方完成,所以我想让它成为一个简单的用户控件。用户控件包含一个中继器控件。默认情况下,中继器显示一个要编辑的地址项。如果需要添加更多地址,用户可以单击按钮添加要输入的其他地址。用户控件应该用于创建新地址以及编辑现有地址。 地址业务实体如下所示: public class Address { public string Street { get; set; }
public class Address
{
public string Street { get; set; }
public City City { get; set; }
public Address(string street, City city)
{
Check.NotNullOrEmpty(street);
Check.NotNull(city);
Street = street;
City = city;
}
}
正如您所见,只有在有街道和城市的情况下,才能实例化地址
现在我的想法是,用户控件公开一个名为Addresses
的集合属性。
此属性的getter从中继器收集地址,并将其返回到集合中。setter将要编辑的地址数据绑定到中继器
像这样:
public partial class AddressEditControl : System.Web.UI.UserControl
{
public IEnumerable<Address> Addresses
{
get
{
IList<Address> addresses = new List<Address>();
// collect items from repeater and create addresses
foreach (RepeaterItem item in addressRepeater.Items)
{
// collect values from repeater item
addresses.Add(new Address(street, city));
}
return addresses;
}
set
{
addressRepeater.DataSource = value;
addressRepeater.DataBind();
}
}
}
public部分类AddressEditControl:System.Web.UI.UserControl
{
公共IEnumerable地址
{
得到
{
IList地址=新列表();
//从中继器收集项目并创建地址
foreach(addressRepeater.Items中的RepeaterItem项)
{
//从中继器项收集值
地址。添加(新地址(街道、城市));
}
返回地址;
}
设置
{
addressRepeater.DataSource=值;
addressRepeater.DataBind();
}
}
}
首先,我喜欢这种方法,因为它是面向对象的,因此很容易重用控件。但在我的项目中的某个地方,我想使用这个控件,以便用户可以输入一些地址。我想预先填充每个转发器项目的街道输入字段,因为我有这些数据,所以用户不需要自己全部输入
现在的问题是,这个用户控件只接受处于有效状态的地址(因为地址对象只有一个构造函数)。所以我不能做:
IList<Addresses> addresses = new List<Address>();
addresses.Add(new Address("someStreet", null)); // i dont know the city yet (user has to find it out)
addressControl.Addresses = addresses;
IList地址=新列表();
Address.Add(新地址(“someStreet”,null));//我还不知道这个城市(用户必须找到它)
addressControl.Addresses=地址;
因此,上述情况是不可能的,因为我会从地址中得到一个错误,因为城市是空的
现在我的问题是:我如何创建这样一个控件?;)
我正在考虑使用地址DTO而不是实际地址,以便以后可以将其映射到地址。这样我就可以传入和传出地址集合,而这些地址不需要是有效的。
还是我误解了用户控件的工作方式?有什么最佳实践吗?直接将业务对象(具有严格的规则和检索构造函数)绑定到用户控件(可能必须允许数据处于部分和无效状态)充满了危险 如果要使用地址视图模型(视图模型是用于控制器和用户控件之间对话的DTO),则可以允许视图模型中的任何旧垃圾,这些垃圾必须在转换为地址之前进行验证 这还允许将视图/用户控件与业务层分离,因此重用变得更容易