我正在尝试“按书”开发ASP.NET应用程序;我的Web窗体实现了MVP模式,我的演示者只与Services层进行对话,而不是与一堆共享我自己的EF ObjectContext的存储库进行对话。到现在为止还挺好。现在我正在解决前端,我陷入两难境地......
假设我有一个名为txtDateOfBirth和提交按钮的asp:TextBox控件。当用户点击按钮时,我需要将数据从ASPX发送到演示者到服务......但问题是最终我不需要String,而是DateTime?并且我不知道进行转换的最佳位置:
你推荐什么?任何见解都值得赞赏......
编辑:好的,在阅读并尝试了所有建议之后,我决定采用以下方式:
答案 0 :(得分:4)
我想说,表示层将原始类型转换为业务层想要处理的任何内容是合法的。
例如在ASP.NET MVC框架中(我知道你没有使用它),业务层使用“模型”与视图层进行通信,这些模型是为三个MVC进行通信而设计的简单,特定于业务的.NET对象层。
答案 1 :(得分:1)
如果我理解正确,你的WebForm中有一个文本框,用户可以写一些应该是日期的东西,对吗?
你可以做些事情:
答案 2 :(得分:1)
1)代码隐藏应该进行转换
2)业务逻辑应该检查业务规则
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
}
}