Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't Reference Dynamic Objects in Embedded ASPX code

I'm creating a List member variable during my Page_Init event. I'm having a problem referencing the objects in the list from my embedded C# code in the *.aspx page. The error is a Runtime Binder Exception that says "'object' does not contain a definition for 'JobID'".

When the debugger is invoked, I can see that the foreach loop's variable j does indeed have a dynamic property named JobID and it's filled with an int value. So, my question is why my embedded C# code can't work with the dynamic object. Is there an <%@ Import %> statement that I need to work with dynamic objects? I tried adding <%@ Import namespace="System.Dynamic" %> but that didn't help.

Thanks for the help. Mark

Code Behind:

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using Jobbarama.WebCode;
    using DataModel;


    public partial class contact : System.Web.UI.Page
    {
        public List<dynamic> JobList { get; set; }

        protected void Page_Init(object sender, EventArgs e)
        {
            SessionManager mgr = SessionManager.Current;

                using (myEntities context = new myEntities())
                {
                    var qry = from c in context.vjobList
                        where c.CampaignID == mgr.CampaignID
                        select new
                        {
                            c.JobID, c.JobTitle, c.CompanyName, c.InterestDate, c.InterestLevel
                        };

                    JobList = qry.ToList<dynamic>();
                }
            }

        }
    }

ASPX Code:

<select id='cboJob' name='cboJob' style='width: 150px;'>
   <%foreach (var j in JobList){ %>
      <option value="<%=j.JobID %>"><%=j.JobTitle%> [<%=j.CompanyName%>]</option>
   <%} %>
</select>
like image 298
sisdog Avatar asked Jan 13 '11 21:01

sisdog


2 Answers

My guess this might be a permission issue due to using an anonymous class and aspx late compiling stuff in different assemblies.

You can use impromptu-interface to make this work.

using ImpromptuInterface

then you make an Interface (I'm using dynamic because i don't know your types)

interface ISelectJob
 dynamic JobID
 dynamic JobTitle
 dynamic CompanyName
 dynamic InterestDate
 dynamic InterestLevel
}

Your Property should use the interface

public List<ISelectJob> JobList { get; set; }

And to create your list just add .AllActLike<ISelectJob>()

JobList = qry.AllActLike<ISelectJob>().ToList();

And this should work, as it generates a lightweight dlr proxy and sets the context to the anonymous class its self so it thinks it always has access, unlike calling with the dynamic keyword.

like image 193
jbtule Avatar answered Nov 02 '22 20:11

jbtule


What about using a LinqDataSource, setting the OnSelecting command, and using a repeater or datalist to display?

like image 33
Tim Avatar answered Nov 02 '22 21:11

Tim