一旦目标.NET项目框架从3.5更改为4.0,就会发现不同的行为。页面包含FormView,ObjectDataSource和按钮导致验证。
按钮事件处理程序中的示例代码:
protected void ButtonUpdate_Click(object sender, EventArgs e)
{
Page.Validate("AssignValidation");
if (!Page.IsValid)
return;
// Make the form invalid by some update of form field
FormView1.UpdateItem(true);
// .NET 3.5 - Page.IsValid == true
// .NET 4.0 - Page.IsValid == false
}
.NET 3.5 - UpdateItem(true)只是将uptates存储到数据库中,不会触发(自定义)验证 .NET 4.x - UpdateItem(true)触发验证,验证器正确验证,不完成对db的更新
是否可以由在4.0版本中完成的ASP.NET中的任何改进/修复引起?你能帮助我理解为什么它在两个版本中都有不同的作用吗?
答案 0 :(得分:1)
看起来3.5可能没有触发验证,因为3.5和4.0的文档是相同的,true应该触发两个版本的验证。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.formview.updateitem(v=vs.90).aspx
为什么要在点击处理程序中验证然后更新,我会反转这两个操作。
答案 1 :(得分:0)
根据Mike的建议,最后一个例子是检查.NET Framework代码 .NET 3.5 UpdateItem()
public virtual void UpdateItem(bool causesValidation) {
HandleUpdate(String.Empty, causesValidation);
}
.NET 4.5.1 UpdateItem()
public virtual void UpdateItem(bool causesValidation) {
ResetModelValidationGroup(causesValidation, String.Empty);
HandleUpdate(String.Empty, causesValidation);
}
private void ResetModelValidationGroup(bool causesValidation, string validationGroup) {
_modelValidationGroup = null;
if (causesValidation && Page != null) {
Page.Validate(validationGroup);
if (EnableModelValidation) {
_modelValidationGroup = validationGroup;
}
}
}
这解释了不同的行为,因为在这种情况下,验证按预期运行.NET 4.x.方法ResetModelValidationGroup在.NET 3.5中不存在,但是从HandleEvent方法中的代码重构,并在UpdateItem方法中也被调用。