2011-01-13 10 views
6

Podczas tworzenia zdarzenia Page_Init tworzę zmienną składową List. Mam problem z odwoływaniem się do obiektów na liście z mojego osadzonego kodu C# na stronie * .aspx. Ten błąd jest wyjątkiem dla modułu wykonawczego programu Runtime, który mówi, że obiekt nie zawiera definicji elementu JobID.Nie można odwoływać się do obiektów dynamicznych we wbudowanym kodzie ASPX

Po wywołaniu debuggera, widzę, że zmienna j pętli foreach rzeczywiście ma właściwość dynamiczną o nazwie JobID i jest wypełniona wartością int. Moje pytanie brzmi, dlaczego mój osadzony kod C# nie może działać z obiektem dynamicznym. Czy istnieje instrukcja <% @ Import%>, którą muszę obsługiwać z obiektami dynamicznymi? Próbowałem dodać <% @ Import namespace = "System.Dynamic"%>, ale to nie pomogło.

Dzięki za pomoc. 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>(); 
       } 
      } 

     } 
    } 

Kod ASPX:

<select id='cboJob' name='cboJob' style='width: 150px;'> 
    <%foreach (var j in JobList){ %> 
     <option value="<%=j.JobID %>"><%=j.JobTitle%> [<%=j.CompanyName%>]</option> 
    <%} %> 
</select> 
+0

Mam taką samą trudność z osadzonym kodem, w którym mój kod odpowiada za IEnumerable . Pojawia się gdzieś, gdzie moja dynamika jest przekształcana w obiekt lub coś. @sisdog, nawet jeśli zmodyfikujesz foreach tak, aby wyglądał jak <% foreach (dynamiczny j w JobList)%>, to nie działa. – kd7iwp

+0

Chociaż nie jest to odpowiedź na pytanie, dlaczego to nie działa, możesz przepisać swój kod, aby korzystać z narzędzia DataBinder.Eval, które wykorzystywałoby odbicie, aby pobrać właściwość JobID. – Tony

Odpowiedz

1

Moje przypuszczenie to może być problem zezwolenie wskutek korzystania anonimową klasę i aspx późno kompilowania rzeczy w różne zespoły.

Możesz użyć impromptu-interface, aby to zadziałało.

using ImpromptuInterface 

wtedy dokonać Interface (używam dynamiczny, ponieważ nie wiem swoje typy)

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

aĹ należy użyć interfejsu

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

i stworzyć Twoja lista wystarczy dodać .AllActLike<ISelectJob>()

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

To powinno zadziałać, ponieważ generuje lekkie proxy proxy i ustawia kontekst na anonimową klasę, więc uważa, że ​​zawsze ma do niej dostęp, w przeciwieństwie do wywoływania za pomocą dynamicznego słowa kluczowego.

+0

Awesome, ale nie mogłem go uruchomić. Otrzymuję ten błąd: 'LINQ to Entities nie rozpoznaje metody 'test.ISelectJob ActLike [IselectJob] (System.Object, System.Type [])' Metoda, a tej metody nie można przetłumaczyć na wyrażenie sklepu' Czy masz jakiś sens? – sisdog

+0

Tak, mój błąd, nie sądzę, IQueryable, mogę naprawić przykład. – jbtule

+0

Gotowe. Wydaje mi się, że czyta się o wiele jaśniej. Chociaż nie musisz tworzyć typu JobList typu statycznego, jeśli istnieje powód, dla którego musi być 'List ', to ostatnią linią może być 'JobList = qry.AllActLike () .ToList (); "po prostu to samo. – jbtule

1

Co powiesz na użycie LinqDataSource, ustawienie polecenia OnSelecting i użycie repeatera lub datalisty do wyświetlenia?

Powiązane problemy