在ASP.NET Web窗体中收集输入值的推荐方法是什么

时间:2012-10-24 13:26:25

标签: asp.net mvp

我正在尝试“按书”开发ASP.NET应用程序;我的Web窗体实现了MVP模式,我的演示者只与Services层进行对话,而不是与一堆共享我自己的EF ObjectContext的存储库进行对话。到现在为止还挺好。现在我正在解决前端,我陷入两难境地......

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

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

你推荐什么?任何见解都值得赞赏......

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

你可以做些事情:

答案 2 :(得分: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
  }
}