Błąd Dostaję jest:Błąd - nie jest oznaczony jako możliwy do serializacji
Type 'OrgPermission' in Assembly 'App_Code.ptjvczom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
tutaj jest mój kod:
Mam GridView, który wykorzystuje następujące DataSource:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetOrgList"
TypeName="Org">
<SelectParameters>
<asp:SessionParameter Name="orgCodes" SessionField="UserOrgs" Type="Object" />
<asp:Parameter DefaultValue="Y" Name="active" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
ustawić zmienną sesji w moim ładowania strony tak:
User cUser = new User(userid);
//make sure the user is an Admin
List<OrgPermission> orgs = new List<OrgPermission>();
foreach(OrgPermission org in cUser.orgs)
{
if (org.type=='admin')
{
orgs.Add(org);
}
}
Session["UserOrgs"] = orgs;
Moja klasa użytkownik wygląda następująco:
public class OrgPermission
{
public string Org { get; set; }
public List<string> type { get; set; }
public OrgPermission()
{ }
}
public class cUser
{
public string userid { get; set; }
public List<OrgPermission> orgs { get; set; }
public clsUser(string username)
{
//i set everything here
}
}
Nie mogę zrozumieć, dlaczego to łamanie, można go używać bez dokonywania to serializacji?
Próbowałem debugować, a zestaw zmiennych sesji był w porządku, następnie przechodzi do GetOrgList i zwrócił prawidłowe wyniki, ale strona nie ładuje się i otrzymuję błąd powyżej.
Oto fragment mojego GetOrgList funkcji:
public DataTable GetOrgList(List<OrgPermission> orgCodes, string active)
{
string orgList = null;
//code to set OrgList using the parameter is here.
DataSet ds = new DataSet();
SqlConnection conn = new SqlConnection(cCon.getConn());
SqlCommand cmd = new SqlCommand("sp_GetOrgList", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@orgList", orgList));
cmd.Parameters.Add(new SqlParameter("@active", active));
conn.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = cmd;
sqlDA.Fill(ds);
conn.Close();
return ds.Tables[0];
}
który to zrobił. Dziękuję Ci! Chyba wciąż mam sposoby na naukę. –
Równie ważne jest * dlaczego * musisz dodać ten tag serializowalny: dowolny obiekt wstawiony do zmiennej sesji (oprócz obiektów podstawowych, takich jak int i bool) musi być oznaczony jako możliwy do serializacji. Należy zauważyć, że niektóre klasy .NET nie są domyślnie - tj. DataView. – Paul
Zachowałem mój typ obiektu typu List w 'Viewstate' i pokazał mi ten sam błąd, gdy próbowałem użyć go jako DataSource dla kontrolera przemiennika. Czy dotyczy to również 'Viewstate' wraz z' Session State'? – sohaiby