Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net用户控件和业务实体_C#_.net_Asp.net - Fatal编程技术网

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),则可以允许视图模型中的任何旧垃圾,这些垃圾必须在转换为地址之前进行验证

这还允许将视图/用户控件与业务层分离,因此重用变得更容易