FormView.UpdateItem(true)在ASP.NET 4.0中的工作方式不同

时间:2013-12-05 11:29:29

标签: asp.net .net-4.0 webforms

一旦目标.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中的任何改进/修复引起?你能帮助我理解为什么它在两个版本中都有不同的作用吗?

2 个答案:

答案 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方法中也被调用。