Orchard CMS: пустое значение в BodyPart

Я разрабатываю собственный модуль новостей для Orchard CMS. Мой NewsItem состоит из нескольких частей: TitlePart, CommonPart, BodyPart и моего собственного NewsPart.

Когда я пытаюсь создать и сохранить элемент, BodyPart становится пустым (остальные части сохраняются правильно), а в БД есть значение NULL. Если я изменю значение столбца Text в таблице Common_BodyPartRecord, а затем открою элемент в режиме редактирования, редактор будет пуст, значение не будет загружено.

вот определение моего NewsItem от migrations.cs:

        ContentDefinitionManager.AlterTypeDefinition("NewsItem", t => t
                .WithPart("NewsPart")
                .WithPart("CommonPart", p => p.WithSetting("DateEditorSettings.ShowDateEditor", "true"))
                .WithPart("TitlePart")
                .WithPart("BodyPart")
                .Draftable()                    
            );

Я пытался отладить BodyPartDriverclass. Когда я загружаю редактор новостей в интерфейсе администратора, метод Editor() имеет входной параметр BodyPart part. это экземпляр BodyPart, прикрепленный к моему NewsItem. А здесь part.Text — пустая строка. Но part.base.Record.Text = "Test" так как я устанавливал напрямую в таблицу БД.

Я не могу понять, что здесь не так. Другие части, такие как TitlePart или мой NewsPart, работают нормально. У меня нет пользовательского кода с этим BodyPart в моем модуле. Кажется, я что-то упустил, но что именно?

Кроме того. В журнале ошибок Orchard есть исключение:

2014-10-22 17:25:15,307 [19] Orchard.ContentManagement.Drivers.Coordinators.ContentPartDriverCoordinator - 
Default - HttpRequestValidationException thrown from IContentPartDriver by 
Orchard.Core.Common.Drivers.BodyPartDriver
http://localhost:30321/OrchardLocal/Admin/News/Edit/56
System.Web.HttpRequestValidationException (0x80004005): A potentially dangerous
Request.Form value was detected from the client (Body.Text="<p>123123123</p>").

PS: я добавил атрибут [ValidateInput(false)] к моему классу NewsAdminController, как по умолчанию Orchard.Core.Contents.Controllers.AdminController. И теперь BodyPart сохраняет корректно. Но мне кажется, что это неправильный путь.


person teran    schedule 22.10.2014    source источник


Ответы (1)


Никогда не изменяйте таблицы базы данных или записи напрямую. Вместо этого просмотрите свойства детали.

Здесь происходит то, что это свойство сохраняется как в записи, так и в информационном наборе. Когда вы изменяете запись, а не информационный набор, в следующий раз, когда вы читаете свойство, значение информационного набора выигрывает, а значение вашей записи перезаписывается. Это одна из многих причин, почему вам никогда не следует прикасаться к пластинкам самостоятельно.

person Bertrand Le Roy    schedule 23.10.2014
comment
вы правы насчет редактирования полей в БД, спасибо, я об этом не подумал. но это должен быть комментарий, а не ответ. - person teran; 23.10.2014
comment
Неправда: вы спрашивали, почему то, что вы сделали, не работает, и я ответил на это. Я также рассказал вам, как это сделать правильно. Это 100% правильный ответ. - person Bertrand Le Roy; 26.10.2014
comment
извините, но вы написали только о том, почему мне не стоит редактировать БД вручную. Ничего о том, почему мой BodyPart не сохраняется. После того, как я отключил ValidateInput в контроллере, он начал работать, но я не уверен, что это хороший способ. Итак, я спросил о сохранении BodyPart проблем, вы ответили о редактировании БД. это не ответ. - person teran; 26.10.2014
comment
Опять же, это неправда: я дал правдоподобное объяснение, заключающееся в том, что когда вы изменяете запись, а не информационный набор, в следующий раз, когда вы читаете свойство, значение информационного набора выигрывает, а значение вашей записи перезаписывается. - person Bertrand Le Roy; 27.10.2014
comment
в порядке. Первоначальный вопрос заключался в том, что я создал NewsItem, добавил BodyPart, и когда я редактирую это значение в AdminUI, ничего не сохраняется. это все. только 2 первых абзаца, включая NewsItem исходный код определения. Забудьте о редактировании БД напрямую, это не вопрос. - person teran; 27.10.2014
comment
Не то, чтобы это имело большое значение, но с первоначальной версией вашего вопроса было трудно точно сказать, что не так, и мой ответ был вполне разумным и правдоподобным объяснением. Он пришел не только с объяснением, но и с обходным путем. Оказалось, что это было не то, что происходило в вашем случае, поэтому можно не помечать это как ответ, но ответ, безусловно, есть. Я очень внимательно оставляю комментарии в комментариях и ответы в ответах. - person Bertrand Le Roy; 28.10.2014