-I dir vs. -isystem dir

Ваша проблема в том, что частичный renders html основан на одном объекте AdminProductDetailModel, но вы пытаетесь отправить обратно коллекцию. Когда вы динамически добавляете новый объект, вы продолжаете добавлять повторяющиеся элементы управления, которые выглядят как (это также создает недопустимый html из-за дубликатов атрибутов id), где они должны быть , и т. Д. для привязки к коллекции на обратной стороне.

DefaultModelBinder требовалось, чтобы индекс для элементов коллекции начинался с нуля и был последовательным, или что значения формы включают в себя Index=someValue, где индекс someValue (например, . Это подробно объясняется в статье Фила Хаака «Связывание модели с списком» . Использование подхода Index обычно лучше, поскольку оно также позволяет удалять элементы из списка (в противном случае было бы необходимо переименовать все существующие элементы управления, чтобы индекс был последовательным).

Два возможных подхода к вашей проблеме.

Вариант 1

Используйте BeginItemCollection для вашего частичного представления. Этот помощник отобразит скрытый ввод для значения Index на основе идентификатора GUID. Это нужно как в частичном представлении, так и в где вы визуализируете существующие элементы. Ваша часть будет выглядеть примерно так:

@model IKLE.Model.ProductModel.AdminProductDetailModel
@using(Html.BeginCollectionItem()) 
{
  
@Html.LabelFor(model => model.fkConfigChoiceCategorySizeId) @Html.DropDownListFor(model => model.fkConfigChoiceCategorySizeId, Model.sizeList, "--Select Size--") @Html.ValidationMessageFor(model => model.fkConfigChoiceCategorySizeId)
.... }

Вариант 2

Вручную создайте элементы html, представляющие новый объект с помощью «фальшивого» индексатора, поместите их в скрытый контейнер, затем в событие кнопки «Добавить», клонирование html, обновление индексаторов и значение индекса и добавление клонированных элементов в DOM. Чтобы убедиться, что html верен, создайте один объект по умолчанию в цикле for и проверьте созданный html. Пример этого подхода показан в в этом ответе


Обратите внимание на использование индексатора «поддельных», чтобы предотвратить его привязку к post back («#» и [%]]

Преимущество варианта 1 состоит в том, сервер при каждом добавлении нового элемента. Преимущество варианта 2 заключается в том, что все его клиентская сторона, но если вы внесете какие-либо изменения в вашу модель (например, добавьте атрибут проверки в свойство), вам также потребуется вручную обновить html, что упростит обслуживание.

Наконец, если вы используете проверку на стороне клиента (jquery-validate-unobtrusive.js), тогда вам нужно повторно проанализировать валидатор каждый раз, когда вы добавляете новые элементы в DOM, как описано в , этот ответ .

$('form').data('validator', null);
$.validator.unobtrusive.parse($('form'));

И, конечно, вам нужно изменить метод POST, чтобы принять коллекцию

[HttpPost]
public ActionResult AddDetail(IEnumerable model)
{
  ....
}

18
задан helpermethod 5 April 2010 в 16:41
поделиться

4 ответа

Из документации gcc для -I :

Добавьте каталог dir в начало списка каталогов, в которых будет производиться поиск файлов заголовков. Это можно использовать для переопределения файла системного заголовка, заменив его собственной версией, поскольку поиск в этих каталогах выполняется раньше, чем в каталогах файлов заголовков системы. Однако вы не должны использовать эту опцию для добавления каталогов, содержащих файлы системных заголовков, предоставленные поставщиком (для этого используйте -isystem). Если вы используете более одной опции -I, каталоги сканируются в порядке слева направо; стандартные системные каталоги идут после.

Если стандартный системный каталог include или каталог, указанный с помощью -isystem, также указан с -I, параметр -I будет проигнорирован. Поиск в каталоге по-прежнему будет выполняться, но как в системном каталоге, занимающем его обычное место в цепочке включения системы. Это сделано для того, чтобы процедура GCC по исправлению ошибочных системных заголовков и порядок директивы include_next не были случайно изменены. Если вам действительно нужно изменить порядок поиска для системных каталогов, используйте параметры -nostdinc и / или -isystem.

Таким образом, -I , вероятно, является предпочтительным вариантом для указания местоположения ваших файлов заголовков, за исключением особых случаев, таких как системные заголовки, предоставляемые поставщиком.

8
ответ дан 30 November 2019 в 03:59
поделиться

Таким образом, вот различие, я нашел путем выполнения некоторых экспериментов. Вообразите следующую установку:

my_std_lib/stdio.h

#ifndef _CUSTOM_STDIO_H

void test() {}

#endif

#include_next <stdio.h>
#include_next <custom.h>

my_user_lib/custom.h

#ifndef _CUSTOM_HEADER_H

void custom_func() {}

#endif

main.cpp

#include "stdio.h"

int main() {
  test();
  custom_func();
  printf("Hello world!");
  return 0;
}

при компиляции использования g++ -isystem my_std_lib -isystem my_user_lib main.cpp, все будет хорошо работать.

Однако g++ -isystem my_std_lib -I my_user_lib main.cpp закончится в ошибку

In file included from main.cpp:1:
my_std_lib/stdio.h:10:15: fatal error: 'custom.h' file not found
#include_next <custom.h>
              ^~~~~~~~~~
1 error generated.

Поэтому, что продолжается?

К моему пониманию, когда я пишу #include "stdio.h", GCC начнет пересекать список доступных заголовочных файлов, пока это не найдет my_std_lib/stdio.h. Директива #include_next <custom.h> в конце этого файла говорит, что компилятор для поиска custom.h пересечением включает каталоги от текущий положение вперед.

, Когда я добавляю my_user_lib к списку каталогов с помощью [1 111] флаг, это появляется прежде все системные каталоги в списке каталога. Поэтому это появляется в списке прежде my_std_lib каталог и #include_next сбои.

то же произошло бы, если бы я должен был скомпилировать использование g++ -isystem my_user_lib -isystem my_std_lib main.cpp. По-видимому, каталоги добавляются к списку в том же порядке, флаги указаны, таким образом, снова, my_user_lib прибудет прежде my_std_lib.

Так, короче говоря -I и -isystem отличаются способом, они добавляют, что их цель к списку включает каталоги.

0
ответ дан 30 November 2019 в 03:59
поделиться

Один из способов увидеть это - использовать заголовки, которые вы контролируете с помощью -I , а те, которые вы не используете ( system, сторонние библиотеки) с -системой . Практическая разница возникает, когда предупреждения включены, и предупреждения, поступающие из заголовков -isystem , будут подавлены.

23
ответ дан 30 November 2019 в 03:59
поделиться

Вы должны использовать -I, чтобы указать расположение ваших заголовков.

Файлы, указанные с помощью -isystem, ищутся после обработки -I и получают специальную обработку со стороны gcc (такую ​​же, как стандартные системные заголовки).

2
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

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