Фон
.NET 4, C #, MVC3, используя JsonFx для сериализации и десериализации данных.Базовый контроллер был расширен для перехвата всех запросов и выполнения следующих действий:
- Получение некоторого JSON с удаленного сервера.
- Запуск запроса LINQ на основе переданных ключей (герой, тело, нижний колонтитул).
- Возвращение универсальной модели в представление.
Этот код прекрасно работает при запуске в контроллере, наследуемом от базового контроллера, но при помещении в базовый контроллер иВызванный из унаследованного контроллера, я получаю следующую ошибку:
Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.ParameterExpression'.
Это неправильная строка:
var queryHero = heroModel.ArrayItems().Where(o => o.DisplayName == keyHero);
Вопрос
Как избежать получения типаошибка когда в базовом контроллере?Это тот же код, который отлично работает в унаследованном контроллере.
Спасибо за ваше время.
Полный код
public models.GenericPageModel GetGenericPageContent(string keyHero, string keyBody, string keyFooter)
{
try
{
// get 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 it
var heroModel = reader.Query<models.PageSectionHeroContent>(heroContent);
var bodyModel = reader.Query<models.PageSectionBodyContent>(bodyContent);
var footerModel = reader.Query<models.PageSectionFooterContent>(footerContent);
// run query for 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 for return
models.PageSectionHeroContent hero;
models.PageSectionBodyContent body;
models.PageSectionFooterContent footer;
// any 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 was an error.",
ContentXML = "<details><error>No data was returned.</error></details>" };
// any 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 was an error.",
ContentXML = "<details><error>No data was returned.</error></details>" };
// any 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 was an error.",
ContentXML = "<details><error>No data was returned.</error></details>" };
// build generic page model
var model = new models.GenericPageModel { PageSectionHeroContent = hero, PageSectionBodyContent = body, PageSectionFooterContent = footer };
return model;
}
catch (Exception ex)
{
//todo: handle, log exception
return null;
}
}