无法将linq查询结果返回到View中

时间:2011-03-16 21:19:45

标签: c# asp.net asp.net-mvc-3

这是我的控制器代码:

 using (var db = new MatchGamingEntities())
        {
            var MyMatches = from m in db.Matches
                            join n in db.MatchTypes on m.MatchTypeId equals n.MatchTypeId
                            select new{
                                MatchTypeName = n.MatchTypeName,
                                MatchTitle = m.MatchTitle,
                                Wager = m.Wager
                            };
            ViewBag.MyMatches = MyMatches.ToList();



            return View();
        }

这是我的观看代码:

@foreach (var item in ViewBag.MyMatches) {
    <tr>
        <td>
             @item.MatchTypeName
        </td>
        <td>
        <a href="Detials/@item.MatchTypeId">@item.MatchTitle</a>

        </td>


        <td>
            @String.Format("{0:F}", item.Wager)
        </td>

    </tr>

我的@ item的工作都没有,我收到一个错误,说他们不知道。我的数据库有记录并且设置正确。他们共享的公共列是MatchTypeId。我不知道如何检查查询是否正在通过。我是否将此联接设置为错误?

更新:

这是错误消息:

'object'不包含'MatchTypeName'的定义

这是例外

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException was unhandled by user code
  Message='object' does not contain a definition for 'MatchTypeName'
  Source=Anonymously Hosted DynamicMethods Assembly
  StackTrace:
       at CallSite.Target(Closure , CallSite , Object )
       at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
       at ASP._Page_Views_Matches_Index_cshtml.Execute() in c:\Users\Anthony\Documents\Visual Studio 2010\Projects\MatchGaming\MatchGaming\Views\Matches\Index.cshtml:line 31
       at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
       at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
       at System.Web.WebPages.StartPage.RunPage()
       at System.Web.WebPages.StartPage.ExecutePageHierarchy()
       at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
       at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
       at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
       at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
  InnerException: 

2 个答案:

答案 0 :(得分:3)

这是因为您的LINQ使用匿名类型作为最终结果(选择新的{}位)。在视图中,因为ViewBag是动态的,所以它能够解析存在“MyMatches”属性,但是除了对象之外,无法解析集合中存储的内容类型。

解决此问题的一个选择是创建一个新类,即:

 public class MatchInfo 
 {
     public string MatchTypeName { get; set; }     
     public string MatchTitle { get; set; }
     public decimal Wager { get; set; }
 }

然后,您可以选择新的MatchInfo {}并初始化属性,而不是选择新的{}。在View中的迭代步骤中,您可以将其更改为:

 @foreach (MatchInfo item in ViewBag.MyMatches) {

 }

现在视图有一个强大的类型可供使用,属性(MatchTypeName,MatchTitle等)将解析。

答案 1 :(得分:0)

<a href="Detials/@item.MatchTypeId">@item.MatchTitle</a>

应该是

 @Html.ActionLink("name link", "action", new { /* id=item.PrimaryKey */ })