0

我目前正在尝试帮助客户跛行以及使用 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 只是被忽略并且页面仍然错误。

4

1 回答 1

1

问题似乎发生在方法内部CPAT.ScoringSheet.GetChoiceStyle(Int32 choiceId) 具体来说,如果给定输入有多个元素,则 linq 查询中似乎有一个 SingleOrDefault 调用,该调用将失败。

如果这不是一个有效条件,我会检查数据并在数据中修复它。否则,您将不得不更改所述方法内的代码以允许更多元素。

于 2013-10-31T03:18:35.527 回答