我正在使用Entity Framework和Telerik RadGrid。我有一个带有约束的表,如果尝试将具有重复名称的产品作为插入,则会抛出异常。我试图在我的业务层中捕获异常并且它似乎通过catch块运行良好但我从Telerik RadScriptManager得到错误
“Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:调用目标已抛出异常。”
而不是我期待的Jquery弹出消息“重复产品”有谁知道我做错了什么?异常是否需要在我的DAL中表现?但我不认为我应该从BLL以外的地方抛出BusinessRuleExceptions。我在下面的BL类中发布了Insert函数,如果有人知道可能导致Jscript错误的原因,请告诉我,谢谢!!
编辑 对象数据源TypeName绑定到Business层ProductBL 产品BL函数Insert_Product作为Insert函数从我的ObjectDataSource调用。在类后面的Product.cs代码中,我有一个插入产品的函数,我传递产品名称(见下文),这个函数有一个try catch bloeck ..我应该在这里抛出异常吗?我认为在业务层中抛出BusinessRulException是正确的。
Product.CS类(对象数据源插入命令)
protected void ODSProducts_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
{
try
{
TextBox txtProductName = (TextBox)ProductsGrid.MasterTableView.GetInsertItem().FindControl("txtProductName");
((ACME.DAL.Product)e.InputParameters[0]).Product.product_name = txtProductName.Text;
}
catch (Exception ex)
{
HTMLError.HtmlError.LogHtmlError(ex, Application["ErrorLog"].ToString());
throw;
}
}
ProductsBL.CS
public void Insert_Product(Product product)
{
try
{
repository.Insert_Product(product);
}
catch (Exception ex)
{
if (ex.GetType().Name == "UpdateException")
{
throw new BusinessRuleException("Duplicate Product");
}
}
}
Product.DAL
public void InsertProduct(Product product)
{
context.Products.AddObject(product);
context.SaveChanges();
}
答案 0 :(得分:1)
您需要点击RadGrid_ItemInserted事件。事件arg应该引用抛出的异常,并且您可以标记您处理了异常,因此它不会冒泡到用户。
如果您让ODS执行完整插入,而不是手动插入,那就是这样。
答案 1 :(得分:0)
好吧,在浪费了太多时间之后,我想出了这个。看起来Telerik不喜欢我从Business Layer类中抛出Business规则异常。所以我最终在对象数据source_Inserted事件的代码隐藏中处理异常。这就是我在事件中显示RadAlertWindow中的错误。
enter code here
protected void ODSProducts_Updated(object sender, ObjectDataSourceStatusEventArgs e)
{
if (e.Exception != null)
{
if (((e.Exception.InnerException).InnerException).Message.Contains("Cannot insert duplicate key row"))
{
RadWindowManager.RadAlert("Duplicate Product, Enter a new Product", 330, 100, "Insert Error", "");
e.ExceptionHandled = true;
}
}
}
我不喜欢检查.InnerException.Message.Contains位,但这是我知道如何确定异常是否是SQL在字段上的唯一约束上抛出重复错误的唯一方法。如果有人知道更优雅的方式,请分享。希望这也有助于其他人。