我试图打破一些编写错误代码的旧习惯。其中一个是放置验证码的地方。我不认为验证应该在表示层中。或者那里可能有一些验证?
这是我过去做的一个例子
protected void SaveBtn_Click(object sender, EventArgs e)
{
Item itm = new Item();
itm.Name = txtName.Text;
if(String.IsNullOrEmpty(itm.Name))
{
//reject
}
else
{
ItemBLL.Save(itm); //no more validation here
}
}
OR
public class ItemBLL
{
public static int Save(Item itm)
{
//no more validation in .aspx.vb
if(String.IsNullOrEmpty(itm.Name))
{
//reject
}
else
{
//Save item
}
}
}
我一直在使用第一种方法而且我正在考虑切换到第二种方法,但我无法预测问题会是什么或者一方面优于另一方面。即使是更好的方法也请赞赏
更新 我同意为了用户的缘故,应该在演示文稿(.aspx)中使用简单的验证(例如常见错误)(使用javascript,jQuery)。
一些业务逻辑验证也应该驻留在BLL中,以实现可移植性和可重用性。
这是否意味着我们可以在代码隐藏(.aspx.vb或.aspx.cs)中跳过验证?
答案 0 :(得分:5)
两者都是最好的,但BLL是必须的。今天,您的业务类仅由一个界面使用 - 浏览器,但明天也许您可能希望Web服务也使用该类。然后,您将需要所有业务规则都在类中,而不是网页。但是你需要在Javascript中测试客户端以提供响应式界面的许多规则。您提供的名称不能为空的示例是经典的,用于在Javascript中进行测试,并且在名称具有值之前不允许启用“保存”按钮。但是,假设Name字段必须是唯一的 - 这可能不是您想要验证客户端的东西,并且愿意等到它到达服务器。
答案 1 :(得分:2)
取决于'验证'的含义 - 在表示层中进行简单的数据验证是完全合法的(并且更可取的是IMO),特别是如果它将往返回发的等待时间节省到服务器。例如,这就是jQuery中Unobtrusive Validation库的重点 - 防止用户提交我们知道无效的数据(空的必填字段,只有数字有效的字母等)。
我还要说,对于验证有一种“检查点”的心态并不是一个坏主意:一旦你跨越了层之间的边界(特别是如果你在任何点上映射到不同的数据类) ),确保数据对于该层打算用它做什么是犹太的。
以某种方式验证每个层的一个优点是,如果您在某处再次使用该层,验证逻辑会随之重复,而不是需要在新项目中重新实现。
当然,这只是我的意见(根据我的经验)。我想听听更有经验的开发人员说的话......