c# - ASP.net 用户控件和业务实体

标签 c# .net asp.net

我目前正在开发一些用户控件,以便我可以在项目中的多个位置使用它们。一个控件是关于编辑客户地址列表的。由于这需要在项目中的多个位置完成,因此我想将其设为简单的用户控件。用户控件包含一个中继器控件。中继器默认显示一个要编辑的地址项。如果需要添加更多地址,用户可以单击按钮来附加要输入的附加地址。用户控件应该用于创建新地址以及编辑现有地址。 地址业务实体如下所示:

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 会将要编辑的地址数据绑定(bind)到转发器。

像这样:

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();
        }
    }
}

首先,我喜欢这种方法,因为它是面向对象的,使得重用控件变得非常容易。但在我的项目中的某个地方,我想使用此控件,以便用户可以输入一些地址。我想预先填写每个中继器项目的街道输入字段,因为我有该数据,因此用户不需要自己输入所有内容。

现在的问题是这个用户控件只接受处于有效状态的地址(因为地址对象只有一个构造函数)。所以我不能这样做:

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;

所以上面的情况是不可能的,因为我会从地址中收到错误,因为城市为空。

现在我的问题是:我将如何创建这样的控件? ;) 我正在考虑使用地址 DTO 而不是真实地址,以便稍后可以将其映射到地址。这样我就可以传入和传出地址集合,其中地址不需要有效。 或者我是否误解了用户控件的工作方式?有没有最佳实践?

最佳答案

将业务对象(具有严格的规则和受限的构造函数)直接绑定(bind)到用户控件(可能必须允许处于部分和无效状态的数据)充满了危险。

如果您要使用地址 View 模型( View 模型是用于在 Controller 和用户控件之间进行通信的 DTO),那么您可以允许 View 模型中出现任何旧的垃圾,这些垃圾必须在之前进行验证它被变成了一个地址。

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

关于c# - ASP.net 用户控件和业务实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2544289/

相关文章:

c# - 在 Unity 应用启动时阅读 Android intent 额外数据

c# - GIT - 不能忽略 .suo 文件

C# Windows 服务在哪里保存设置 Properties.Setting

.net - 如何更改 MonthCalendar 控件中某些日期的颜色?

c# - ASP.NET MVC Razor : Add empty value to a DropDownList

asp.net - 如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器

c# - Aes 和 AesManaged 有什么区别

.net - 制作将使用 Windows Temp 目录的自解压 zip (SFX) Windows 程序安装程序的最简单方法是什么?

c# - 在 C# 中的数据模型上运行 lambda 时不支持的异常

c# - ??或 .GetValueOrDefault()