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 codepublic 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.
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
Post a Comment