我目前正在尝试帮助客户跛行以及使用 C# 和 aspx 编写的非常古老的 .NET 应用程序。.NET 和 C# 不是我通常使用的主要、第二甚至第三技术,因此我对它们的了解相当有限。
最大的问题是我们没有应用程序的 C# 端的源代码,我们唯一可以查看甚至编辑的是 aspx 文件。
我们有一个页面给我们以下错误:
序列包含多个匹配元素
说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:序列包含多个匹配元素
源错误:
Line 54: <asp:DataList ID="dlChoice" runat="server" DataSource='<%# GetChoices(Convert.ToInt32(Eval("QuestionId"))) %>' RepeatColumns="3" RepeatDirection="Horizontal" RepeatLayout="Table" EnableViewState="false">
Line 55: <ItemTemplate>
Line 56: <span id='s<%# Eval("ChoiceId") %>' class='<%# GetChoiceStyle(Convert.ToInt32(Eval("ChoiceId"))) %>'><%# GetTextBoxes(Convert.ToInt32(Eval("QuestionId")), Convert.ToInt32(Eval("ChoiceId")),Convert.ToString(Eval("Points"))) %> <%# ReplaceToken(Eval("ChoiceText").ToString()) %></span>
Line 57: </ItemTemplate>
Line 58: </asp:DataList>
源文件:e:\inetpub\webapp\ScoringSheet.aspx 行:56
堆栈跟踪:
[InvalidOperationException: Sequence contains more than one matching element]
System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source, Func`2 predicate) +1304639
lambda_method(ExecutionScope ) +97
System.Linq.EnumerableExecutor`1.Execute() +244
System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +154
System.Linq.Queryable.SingleOrDefault(IQueryable`1 source, Expression`1 predicate) +422
CPAT.ScoringSheet.GetChoiceStyle(Int32 choiceId) +298
ASP.scoringsheet_aspx.__DataBind__control11(Object sender, EventArgs e) in e:\inetpub\webapp\ScoringSheet.aspx:56
System.Web.UI.Control.OnDataBinding(EventArgs e) +132
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +170
System.Web.UI.Control.DataBindChildren() +11045679
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
System.Web.UI.WebControls.DataList.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem) +175
System.Web.UI.WebControls.DataList.CreateControlHierarchy(Boolean useDataSource) +734
System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e) +89
System.Web.UI.Control.DataBindChildren() +11045679
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +674
System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +68
System.Web.UI.Control.DataBindChildren() +11045679
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
System.Web.UI.WebControls.ListView.CreateItemsWithoutGroups(ListViewPagedDataSource dataSource, Boolean dataBinding, InsertItemPosition insertPosition, ArrayList keyArray) +924
System.Web.UI.WebControls.ListView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +838
System.Web.UI.WebControls.ListView.PerformDataBinding(IEnumerable data) +46
System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +147
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +261
System.Web.UI.WebControls.ListView.PerformSelect() +74
CPAT.ScoringSheet.Page_Load(Object sender, EventArgs e) +3500
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
System.Web.UI.Control.OnLoad(EventArgs e) +132
System.Web.UI.Control.LoadRecursive() +66
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428
版本信息:Microsoft .NET Framework 版本:2.0.50727.5420;ASP.NET 版本:2.0.50727.5420
我的问题:如何添加足够的错误处理以在违规标记所在的位置显示一个不错的小错误消息,但允许页面的其余部分呈现? 这将使我能够准确地看到数据集的哪一部分有问题。我怀疑数据库中有问题(重复记录、错误数据等),但我找不到或查看正在运行的查询,也找不到哪些数据破坏了页面。
我尝试添加各种 try / catch 块,但我怀疑这些数据绑定以某种方式单独运行,并且我添加的 try / catch 只是被忽略并且页面仍然错误。