Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 27609|Відповідь: 3

[WebAPI] WebAPI не може прив'язувати кілька параметрів (SB і SB1) до вмісту запиту

[Копіювати посилання]
Опубліковано 16.08.2016 13:52:38 | | | |



У WebAPI тіло запиту (HttpContent) можна прочитати лише один раз, не кешувати і читати лише вперед.

Наприклад:

1. Адреса запиту: /?id=123&name=bob

    Серверний метод: void Action(int id, ім'я рядка) // Всі параметри прості типи, тому всі вони походять з URL

2. Адреса запиту: /?id=123&name=bob

    Серверний метод: void Action([FromUri] int id, [FromUri] ім'я рядка) // Те саме, що й вище

                      ім'я рядка void Action([FromBody]); Атрибут [FormBody] показує, що все тіло читається як рядок у вигляді аргументу

3. Адреса запиту: /?id=123

    Визначення класу:

публічний клас Customer { // Визначено складний тип об'єкта
  public string Name { get; декорація; }
  public int Age { get; декорація; }
}

    Серверний метод: void Action(int id, Customer c) // Ідентифікатор параметра зчитується зі рядка запиту, параметр c — складний клас об'єкта Customer, зчитуваний від тіла до formatter

    Метод на стороні сервера: void action (Клієнт c1, Клієнт c2) // Помилка! Множинні параметри є складними типами, і всі вони намагаються читати з тіла, яке можна прочитати лише один раз

    Метод на стороні сервера: void action([FromUri] Клієнт c1, Клієнт c2) // Так! На відміну від дії вище, складний тип C1 буде зчитуватися з URL, а C2 — з тіла

4. Метод ModelBinder:

void Action([ModelBinder(MyCustomBinder)] SomeType c) // Вказує, що для розв'язання параметра використовується конкретний зв'язувач моделі

[ModelBinder(MyCustomBinder)] публічний клас SomeType { } // Застосуйте це правило до всіх параметрів типу SomeType, оголосивши атрибут [ModelBidner(MyCustomBinder)] для конкретного типу SomeType

void Action (SomeType c) // Оскільки тип c — SomeType, характеристики SomeType застосовуються для визначення зв'язування моделі



Зведення:

1. Стандартні прості параметри передаються через параметри URL, з винятками:

1.1 Якщо маршрут містить параметр id, параметр id передається через маршрут;

1.2 Якщо параметр позначений як [FromBody], параметр може бути простим параметром, і клієнт може передати його через POST: $.ajax(url, '=value') або $.ajax({url: url, data: {'': 'value'}});

2. Стандартні комплексні параметри (класи власних сутностей) передаються через POST, з винятками:

2.1 Якщо значення параметра позначено як [FromUri], параметр може бути комплексним параметром;

3. Параметр з позначкою [FromBody] може з'являтися лише один раз, параметр, позначений як [FromUri], може з'являтися кілька разів, і якщо параметр, позначений як [FromUri], є простим параметром, тег можна видалити.




Попередній:.NET Oracle multitable query method — дурний метод.
Наступний:C# використовує відображення для визначення, чи присвоєна властивість
Опубліковано 16.08.2016 15:21:29 |
ModelBinder повинен мати клас ознак для ModelBinderAttribute

Схоже на фільтри
Опубліковано 16.08.2016 15:21:44 |
Приходьте щодня в гості
Опубліковано 16.08.2016 15:22:00 |
Дай мені трохи престижу
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com