今天无意中发现的一个兼容性问题。如果你使用了Monorail+Linq进行开发,这个问题很值得注意。
我在项目中使用Linq内置的OnXXXChanged/OnXXXChanging进行数据有效性验证,比如

partial void OnTopicChanging(string value)
      
{
            
if (!value.IsLengthIn(1100))
                
throw new DataException("主题不符合要求,请返回重新填写");
        }

然后在前台用SmartDispatcherController进行数据绑定,比如
public void Post([DataBind("article")]ArticleInfo articleInfo)
{}

然后我在Globle.ascx.cs中进行未处理异常的捕获

但奇怪的是,当OnTopicChanging中的异常发出后,Globle.ascx.cs竟然无法捕获。也就是说,如果你直接像我这样绑定数据并处理异常的话,是无法得到想要的结果的。
其实原因很简单,SmartDispatcherController在数据绑定的时候用了一个try catch,然后把绑定过程中发生的所有错误全部截获,并放到了BoundInstanceErrors中去了。
解决方法有两个:1.判断BoundInstanceErrors的Count并做相应处理;2.把OnTopicChanging中的验证移到OnValidate中去....
怨念啊~~~我不知道ASP.NET MVC是否存在类似的问题,有条件的朋友可以测试一下。