views:

4828

answers:

4

Hey all,

Im having problems displaying records to my view when passing viewdata to a user control. This is only apparent for linq to sql objects where I am using table joins.

The exception I receive is "Unable to cast object of type '<>f__AnonymousType410[System.String,System.Int32,System.Nullable1[System.DateTime],System.String,System.String,System.String,System.String,System.String,System.Nullable1[System.Single],System.Nullable1[System.Double]]' to type App.Models.table1."

I have searched for a fix to this issue but not too familiar on whats wrong here for me to search for the right subject. This should be working in theory and this works for single table retrieving but when I added a join in their I ran into problems. I am currently using a foreach statement to query through my data via single table declaration. Any help would be greatly appreciated. Thanks in advance.

My current setup is:

CViewDataUC.cs(my class to hold viewdata and data connections specifically for user controls)

public void Info(ViewDataDictionary viewData, int id)
    {
        var dataContext = new testDataContext();

        var info = from table1 in dataContext.table1
                   join table2 in dataContext.table2 on table1.type_id equals table2.type_id
                   join table3 in dataContext.table3 on table1.id equals table3.id
                   join table4 in dataContext.table4 on table1.id equals table4.id
                   where table1.id == id
                   select new
                   {
                       table1.column1,
                       table1.column2,
                       table1.column3,
                       table1.column4,
                       table1.column5,
                       table1.column6,
                       table1.column7,
                       table2.column1,
                       table3.column1,
                       table4.column1
                   };         

        viewData["vd_Info"] = info;

    }

HomeController.cs(Controller)

public ActionResult Information(int id)
        {
            ViewData["Title"] = "Information";


            CViewDataUC o_info = new CViewDataUC();

            o_info.Info(this.ViewData, id);


            return View();
        }

Information.aspx(View)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"
    CodeBehind="Info.aspx.cs" Inherits="App.Views.Info" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <%Html.RenderPartial("~/Views/UserControls/Info.ascx", ViewData["vd_Info"]);%>
</asp:Content>

Info.ascx(User Control)

<%foreach (table1 m in (IEnumerable)ViewData.Model)
  { %>
<div class="left">
    <br />
    <br />
    <p id="medium">
        Column 1
        <br />
        <%= Html.TextBox("column1", m.column1, new {@class = "textBox", @readonly = "readonly" })%>
        Column 1
        <br />
        <%= Html.TextBox("column2", m.column2, new {@class = "textBox", @readonly = "readonly" })%>
        <br />
        Column 1
        <br />
        <%= Html.TextBox("column3", m.column3, new {@class = "textBox", @readonly = "readonly" })%>
                </p>
</div>
<%}%>
+2  A: 
foreach (table1 m in (IEnumerable)ViewData.Model)

m is not of type table1. It is an anonymous type (select new { ... } in CViewDataUC.cs).

You should create a class that represents the type of the model objects you are passing from controller to view.

Justice
+2  A: 

Thanks, that worked like a charm. I totally overlooked the problem, I guess it's a Monday that's why :P. But for the people that run in the same problem and are still new to MVC and LINQ to SQL the problem is solved easily do these steps:

  1. Create a class CInformation.cs Add variables similiar to your query

    public class CInformation {

    public CInformation() { }
    
    
    public string _column1{ get; set; }
    public string _column2{ get; set; }
    ...
    

    }

  2. In your query

    public void uc_VDGenInfoDC(ViewDataDictionary viewData, int id) {

        var dataContext = new testDataContext();
    
    
    
    IQueryable&lt;CInformation&gt; info = from table1 in dataContext.table1
                                    join table2 in dataContext.table2 on table1.type_id equals table2.type_id        
                                    join table3 in dataContext.table3 on table1.id equals table3.id                  
                                    join table4 in dataContext.table4 on table1.id equals table4.id                       
               where table1.test_id == id
               select new CInformation
               {
                   _column1 = table1.column1.ToString(),
                   _column2 = table2.column1.ToString(),
                   ...
               };         
    
    
    viewData["vd_Info"] = info;
    
    }
  3. In your User Control or view

    foreach (CInformation m in (IEnumerable)ViewData.Model){

     m.column1
     m.column2
     ...
    

    }

Ayo
A: 

Thanks, this has helped me a lot!

One small comment, you have to use angle brackets:

IQueryable<CInformation> info = from table1 in dataContext.table1
Jacqueline
A: 

Hi, Thank you for the post solved my problem too.. thank you guys.. u rock

anurag singh