使用ADO.NET实体数据模型处理ASP.NET动态数据中的数据库插入冲突

时间:2014-12-28 17:45:42

标签: asp.net entity-framework dynamic-data

我正在使用Visual Studio 2013处理ASP.NET动态数据实体项目。我的数据源是基于SQL Server数据库的ADO.NET实体数据模型。

当我尝试插入违反唯一键约束的新表条目时,我得到一个非常用户不友好的错误页面,其中包含整个堆栈跟踪。 是否可以在插入视图中显示一条简短的错误消息? (类似于必填字段为空时的错误消息)

到目前为止我尝试的是在 Insert.aspx.cs

中扩展以下代码
protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e) {
    if (e.Exception == null || e.ExceptionHandled) {
        Response.Redirect(table.ListActionPath);
    }
}

到此(检查与异常号2627的唯一键冲突)

protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e) {
    if (e.Exception == null || e.ExceptionHandled) {
        Response.Redirect(table.ListActionPath);
    }
    else
    {
        SqlException innerException = e.Exception.InnerException as SqlException;
        if (innerException != null)
        {
            if (innerException.Number == 2627)
            {
                // Violation of unique constraint
                throw new ValidationException("Unique key violation");
            }
        }
    }
}

虽然 Insert.aspx 使用asp:DynamicValidator,但我得到以下异常: " ValidationException未被用户代码处理。"

有谁知道该怎么做?非常感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

asp:DynamicValidator必须绑定到特定控件才能工作(使用ControlToValidate属性):然后它将拦截任何异常(不仅仅是ValidationException)控制的服务器端事件。

在您的方案中,我会使用asp:CustomValidator代替行事:

ASP.NET页面

<asp:CustomValidator runat="server" id="myValidationControl"
    OnServerValidate="myValidationControl_ServerValidate" />

<强>代码隐藏:

private bool _ConstraintViolation = false;

protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e) 
{
    if (e.Exception == null || e.ExceptionHandled) {
        Response.Redirect(table.ListActionPath);
    }
    else
    {
        SqlException innerException = e.Exception.InnerException as SqlException;
        if (innerException != null)
        {
            if (innerException.Number == 2627)
            {
                // Violation of unique constraint
                _ConstraintViolation = true;
            }
        }
    }
}

void myValidationControl_ServerValidate (object source, ServerValidateEventArgs a)
{
    if (_ConstraintViolation)
    {
        a.IsValid = false;
        myValidationControl.ErrorMessage = 
        myValidationControl.Text = "Unique key violation";
    }
    else a.IsValid = true;
}

您需要调整我的代码到您的网页(即附加正确的ValidationGroup等),但这可以解决您的问题。