При тестировании неизмененного основного демонстрационного приложения CodeEffects asp.net (Editor 5.0.4.8, Engine 5.0.2.6) я обнаружил интересную проблему.
Если я создаю правило выполнения, которое проверяет, например, содержит ли FirstName два пробела, я могу без проблем сохранить это правило, и в действии SaveRule оно проходит проверку с использованием editor.Rule.IsValid .Вот пример определения правила:
<if>
<clause>
<condition type="contains" stringComparison="OrdinalIgnoreCase">
<property name="FirstName" />
<value> </value>
</condition>
</clause>
<then>
<method name="Register">
<value>aaaa</value>
</method>
</then>
</if>
Но при обновлении редактора и попытке загрузить это сохраненное правило оно не загружается в редактор.Причина в том, что действие контроллера LoadRule возвращает пустой json.
При дальнейшем рассмотрении выясняется, что editor.GetClientRuleData возвращает значение NULL, поскольку правило недопустимо.Если я проверю editor.Rule.IsValid непосредственно перед вызовом editor.GetClientRuleData Я вижу, что он возвращает false, а editor.Rule.InvalidElements содержит один элемент:
{{c:"",h:"v120"}}
Сообщение об ошибке будет следующим: «Единственные разрешенные операторы для пустых строковых значений - это IS и IS, а не», но, конечно, оно не отображается в редакторе в демонстрационном проекте, поскольку этого не ожидается.
Неконечно, если это каким-либо образом связано с проблемой, но одно очевидное различие между действиями LoadRule и SaveRule заключается в способе загрузки правила.
При сохранении правила данные правила (поступающие из пользовательского интерфейса) загружаются в редактор с помощью
editor.LoadClientData(data.Data);
, а при загрузке правила оно эффективно загружается с использованием xml (из хранилища)вызов этого:
editor.Rule = Rule.Models.RuleModel.Create(ruleXml, typeof(Models.Patient))
Итак, мой вопрос: почему недопустимое правило может пройти проверку при сохранении, а затем это же правило не проходит проверку при загрузке?Любое исправление я могу попробовать или обходной путь?