我正在使用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未被用户代码处理。"
有谁知道该怎么做?非常感谢。
答案 0 :(得分:0)
我找到了解决方案。显然,EF中的ValidationExceptions存在一些问题。
答案 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
等),但这可以解决您的问题。