Как я могу сделать, условное выражение AJAX-y показывает/скрывает поля формы в направляющих?

Ваша основная проблема в том, что вы объявили ErrorDTO как IEnumerator, IEnumerable, то есть нетипизированный, неуниверсальный перечислимый тип. Json.NET интерпретирует такой объект как нетипизированную только для чтения коллекцию , поэтому при попытке ее заполнения вы получите исключение:

System.ArgumentNullException: Value cannot be null.
   at System.RuntimeType.MakeGenericType(Type[] instantiation)
   at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)
   at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)
   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target)

Сообщение об исключении не является полезный и вводящий в заблуждение, но настоящая причина в том, что Json.NET не имеет возможности узнать ни целевой тип элементов коллекции, к которым следует десериализоваться, ни метод добавления их после десериализации для любой нетипизированной коллекции только для чтения.

Обычным способом решения такой проблемы было бы объявить ErrorDTO как ICollection и реализовать необходимые обобщенные методы, информируя тем самым Json.NET как о типе элемента, так и о [116 ] , но, к сожалению, вы утверждаете

Я не могу изменить их [классы].

blockquote>

Таким образом, самым простым обходным решением было бы заполнение базового списка:

Newtonsoft.Json.JsonConvert.PopulateObject(json, resultDTO.ErrorList);

Демо-скрипка здесь .

6
задан scottburton11 5 February 2009 в 03:02
поделиться

3 ответа

Я обрабатываю то же самое несколько различных путей:

<%= link_to_function( check_box_tag "model[attribute_name]" ) do |page| 
    page.toggle :model_attribute_name
end-%>

<span style="display:none;" id="model_attribute_name">  
<%= f.text_area :other_conditional_attribute -%>  
</span>

или

<%= link_to_function "Conditional Item", :class => "your-style-class" do |page| 
    page.insert_html :bottom, :other_conditional_attribute, :partial => 'conditional_attribute_partial', :object => Object.new, :locals => {:local_variable => local_variable}
end-%>

Помощники материала/прототипа rjs являются удивительными.
Направляющие API: PrototypeHelpers
Направляющие API: JavascriptHelpers

3
ответ дан 16 December 2019 в 21:47
поделиться

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

То, что я сделал бы, отделено Ваше поведение в файл JavaScript, который Вы кодируете сами. При пользовании библиотекой, такой как jQuery (моим фаворитом для этого вида вещи является lowpro, но я буду первым, чтобы признаться, что был немного установлен в моих путях), довольно легко присоединить обработчик событий к определенным элементам (или к целому классу элементов сразу).

Для избранного поля будет запущен onChange обработчик, когда пользователь изменит выбор. selectedIndex свойство на элементе скажет Вам, какая опция выбрана, и options массив позволит Вам искать связанную опцию. Так, в Вашем обработчике Вы могли сделать что-то как следующее (использующий прототип):

function(e) {
  var element = Event.element(e)
  var index = element.selectedIndex
  var option = element.options[index]

  if(option.value == "Show fields")
    $('hidden-fields').show()
  else
    $('hidden-fields').hide()
}
4
ответ дан 16 December 2019 в 21:47
поделиться

Я предложил бы использовать простую функцию JQuery вроде:

$('a#slick-show').click(function() {
    $('#slickbox').show('slow');
    return false;
  });

Для основ показывают/скрывают в JQuery, здесь существует учебное руководство.

1
ответ дан 16 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: