4

我正在尝试“按书”开发一个 ASP.NET 应用程序;我的 Web 窗体实现了 MVP 模式,我的演示者只与服务层对话,而不是与一堆共享我自己的 EF ObjectContext 的存储库对话。到目前为止,一切都很好。现在我正在处理前端,我有一个困境......

假设我有一个名为 txtDateOfBirth 的 asp:TextBox 控件和提交按钮。当用户单击按钮时,我需要将数据从 ASPX 发送到 Presenter 到 Service 到 .... 但问题是最后我不需要 String,而是 DateTime?而且我不知道进行转换的最佳位置

  • 我应该在 ASPX 页面中放置一个验证器,然后在代码隐藏中进行转换吗?
  • 或者我应该从表单中收集一堆字符串,为只包含字符串的服务创建一个请求,然后让我的业务模型执行尝试/转换并报告错误?

你有什么建议吗?任何见解表示赞赏...

编辑:好的,在阅读并尝试了您的所有建议后,我决定采用以下方法:

  1. 代码隐藏和 APSX 负责数据类型转换。我决定使用简单的 CompareValidator 并检查适当的类型,以便代码隐藏可以肯定地转换它。
  2. 从演示者到服务层的请求是适当类型的。
  3. 所有其他验证都由业务层完成(包括字符串长度、是否需要、范围等)
4

3 回答 3

4

我会说表示层将原始类型转换为业务层想要处理的任何内容是合法的。

例如,在 ASP.NET MVC 框架中(我知道您没有使用它),业务层使用“模型”与视图层通信,这些模型是简单的、特定于业务的 .NET 对象,旨在与三个 MVC 层通信。

于 2012-10-24T13:31:40.377 回答
1

1)代码隐藏应该进行转换

  • 例如,输入字符串(从 txtDateOfBirth)到 DateTime 还是 DateTime?

2)业务逻辑要检查业务规则

  • 例如,用户必须年满 16 岁

3)方法应该是

  • InsertUser(User user) {}或者
  • InsertUser(string firstName, string lastName, DateTime or DateTime? dateOfBirth) {}

您可以看到 .Net Framework 主要使用强类型参数,而不是字符串和对象。

如果您不想传递可为空的值,可以使用 DotNetNuke中使用的以下方法。

public class Null
{    
    public static int NullInteger
    {
        get { return -1; }
    }    

    public static decimal NullDecimal
    {
        get { return decimal.MinValue; }
    }

    public static DateTime NullDate
    {
        get { return DateTime.MinValue; }
    }

    ...
}

已编辑- 根据您的要求,我在代码后面添加了代码。这不是一个真正的模式。这只是个人喜好。

public string FirstName
{
  get { return FirstNameTextBox.Text; }
}

public string LastName
{
  get { return LastNameTextBox.Text; }
}

public DateTime DateOfBirth
{
  get
  {
    DateTime d;
    return DateTime.TryParse(DateOfBirthTextBox.Text, out d) ? 
      d : Null.NullDate;
  }
}

protected void SaveButton_Click(object sender, EventArgs e)
{
  try
  {
    var user = new Users()
    {
      FirstName = this.FirstName,
      LastName = this.LastName,
      DateOfBirth = this.DateOfBirth
    };
    UserService.InsertUser(user);
    ... 
  }
  Catch (Exception ex)
  {
    // Log error
  }
}
于 2012-10-24T14:15:17.593 回答
1

如果我理解正确,您的 WebForm 中有一个文本框,用户可以在其中写一些应该是日期的东西,对吧?

你可以做一些事情:

于 2012-10-24T13:37:00.893 回答