c# - MVC3 Base Contoller Crashes, Same Code Works in Inherited Controller -



c# - MVC3 Base Contoller Crashes, Same Code Works in Inherited Controller -

background

.net 4, c#, mvc3, using jsonfx serialize , deserialize data. base of operations controller has been extended intercept requests , following:

get json remote server. run linq query based on passed in keys (hero, body, footer). return generic model view.

this code works fine when running in controller inheriting base of operations controller, when placed in base of operations controller , called inherited controller, next error:

unable cast object of type 'system.linq.expressions.constantexpression' type 'system.linq.expressions.parameterexpression'.

this offending line:

var queryhero = heromodel.arrayitems().where(o => o.displayname == keyhero); question

how avoid getting type error when in base of operations controller? it's same code runs fine in inherited controller.

thanks time.

full code public models.genericpagemodel getgenericpagecontent(string keyhero, string keybody, string keyfooter) { seek { // content "tables" var herocontent = getjson("page_section_hero_content"); var bodycontent = getjson("page_section_body_content"); var footercontent = getjson("page_section_footer_content"); // new reader var reader = new jsonreader(new datareadersettings(new datacontractresolverstrategy())); // read var heromodel = reader.query<models.pagesectionherocontent>(herocontent); var bodymodel = reader.query<models.pagesectionbodycontent>(bodycontent); var footermodel = reader.query<models.pagesectionfootercontent>(footercontent); // run query current page var queryhero = heromodel.arrayitems().where(o => o.displayname == keyhero); var querybody = bodymodel.arrayitems().where(o => o.displayname == keybody); var queryfooter = footermodel.arrayitems().where(o => o.displayname == keyfooter); // models homecoming models.pagesectionherocontent hero; models.pagesectionbodycontent body; models.pagesectionfootercontent footer; // hero content? if (queryhero.any()) hero = new models.pagesectionherocontent { displayname = queryhero.firstordefault().displayname, contentxml = queryhero.firstordefault().contentxml }; else hero = new models.pagesectionherocontent { displayname = "sorry, there error.", contentxml = "<details><error>no info returned.</error></details>" }; // body content? if(querybody.any()) body = new models.pagesectionbodycontent { displayname = querybody.firstordefault().displayname, contentxml = querybody.firstordefault().contentxml }; else body = new models.pagesectionbodycontent { displayname = "sorry, there error.", contentxml = "<details><error>no info returned.</error></details>" }; // footer content? if(queryfooter.any()) footer = new models.pagesectionfootercontent { displayname = queryfooter.firstordefault().displayname, contentxml = queryfooter.firstordefault().contentxml }; else footer = new models.pagesectionfootercontent { displayname = "sorry, there error.", contentxml = "<details><error>no info returned.</error></details>" }; // build generic page model var model = new models.genericpagemodel { pagesectionherocontent = hero, pagesectionbodycontent = body, pagesectionfootercontent = footer }; homecoming model; } grab (exception ex) { //todo: handle, log exception homecoming null; } }

can't sure is not initializing on time in basecontroller, found work-around.

disclaimer: on same dev team boynamedjib , solution may suited best our particular situation. having said that, solution worth posting, feel, might help others encounter quirk.

solution

the solution found in making utilize of combination of dynamic types , expandoobjects specific c# 4.0, idictionary type.

public models.genericpagedatamodel getgenericpagecontent(string keyhero, string keybody, string keyfooter) { seek { var pagedata = new list<models.genericpagedata> { new models.genericpagedata{key = "heromodel",value = getjson("pro_page_section_hero_content")}, new models.genericpagedata{key = "bodymodel",value = getjson("pro_page_section_body_content")}, new models.genericpagedata{key = "footermodel",value = getjson("pro_page_section_footer_content")} }; var reader = new jsonreader(); var model = new models.genericpagedatamodel(); foreach (var p in pagedata) { var objlist = new list<expandoobject>(); dynamic output = reader.read(p.value); foreach (var h in output) { dynamic obj = new expandoobject(); foreach (dynamic o in h) { var item = obj idictionary<string, object>; item[o.key] = o.value; } objlist.add(obj); } switch (p.key) { case ("heromodel"): model.heromodel = objlist.firstordefault(o => o.firstordefault(i => i.key.equals("displayname")).value.equals(keyhero)); break; case ("bodymodel"): model.bodymodel = objlist.firstordefault(o => o.firstordefault(i => i.key.equals("displayname")).value.equals(keybody));; break; case ("footermodel"): model.footermodel = objlist.firstordefault(o => o.firstordefault(i => i.key.equals("displayname")).value.equals(keyfooter));; break; default: break; } } homecoming model; } grab (exception ex) { homecoming null; } } supporting models public class genericpagedata { public string key { get; set; } public string value { get; set; } } public class genericpagedatamodel { public expandoobject heromodel { get; set; } public expandoobject bodymodel { get; set; } public expandoobject footermodel { get; set; } } razor usage @model my.project.com.models.contentmodels.genericpagedatamodel @{ viewbag.title = "my title"; layout = "~/views/shared/_layout.cshtml"; viewbag.herodisplayname = @model.heromodel.todictionary(p => p.key).firstordefault(k => k.key.equals("displayname")).value.value; } <h1> @viewbag.herodisplayname</h1>

c# asp.net-mvc-3 inheritance singleton

Comments

Popular posts from this blog

How do I check if an insert was successful with MySQLdb in Python? -

delphi - blogger via idHTTP : error 400 bad request -

postgresql - ERROR: operator is not unique: unknown + unknown -