Вызов С# Web Api не вызывается из jquery

Я делаю вызов POSTweb-api из сценария jQuery, но данные не являются обязательными. Page это null

Jquery

$("document").ready(function(){
    myTimer= setInterval( "StartTimer()", 1000);
});
function StartTimer()
{
    $.ajax({
        type: 'POST',
        contentType: "application/x-www-form-urlencoded",
        url: "/api/sitehit/LogHit/",  //method Name 
        data:  'Page=test' ,
        dataType: 'text/plain',
        error: function (msg) {
            alert(msg.responsetext);
        }
    }).fail(function () {
        alert("error logging hit");
    }).success(function () {
        alert("success logging hit");
    });
    clearInterval(myTimer);
}

код С#

public class SiteHitController : ApiController
{
    [HttpPost]
    public void LogHit(string Page)  // Page not binding
    {
        var c= Page; // Page is null
    }
}

Не полезно. Я вызываю API/Controller/Action/StringData, но все равно безрезультатно

Sujoy 20.01.2019 20:03

Взгляните на stackoverflow.com/questions/19093603/simple-post-to-web-api.‌​.

Adersh M 21.01.2019 15:30

Также убедитесь, что ваша настройка маршрутизации верна, поскольку для методов не указан атрибут маршрута...

Adersh M 21.01.2019 15:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В контроллере не задан маршрут для /api/sitehit/LogHit. ApiControllers работают не так, как обычные контроллеры MVC. Имя действия не является маршрутом конечной точки, если вы его не укажете.

Вы можете добавить атрибут маршрута к действию контроллера.

[Route("LogHit")]
[HttpPost]
public void LogHit(string Page)
{
}

Или (при условии, что на контроллере нет других методов HttpPost) измените URL-адрес jQuery на url: '/api/sitehit'.

Существует несколько способов привязки данных в зависимости от типа содержимого, которое вы хотите отправить. Предполагая, что вы хотите использовать JSON, вы можете сделать что-то вроде следующего.

Создайте модель для привязки и добавьте [FromBody] в параметр действия контроллера:

public class MyModelDto
{
    public string Page { get; set; }
}

[Route("LogHit")]
[HttpPost]
public void LogHit([FromBody] MyModelDto model) // add FromBody here
{
    // model.Page will contain "test"
}

Затем убедитесь, что вы отправляете JSON в вызове ajax, используя JSON.stringify() для преобразования данных в строку.

$.ajax({
    type: 'POST',
    contentType: "application/json",
    url: "/api/sitehit/LogHit",
    data: JSON.stringify({Page: 'test'}),  // use JSON.stringify()
    dataType: 'json',
    success: function (data) {
        // can use response data here
        alert("success logging hit");
    },
    error: function (msg) {
        alert(msg.responsetext);
    }
});

Теперь это должно правильно привязываться к вашему контроллеру.

Если вы отправляете данные формы x-www-form-urlencoded, используйте вместо этого [FromForm], и вам не нужно использовать JSON.stringify(), но в этом случае параметры должны быть отправлены в форме строки запроса: page=test&prop2=test2.

Надеюсь это поможет.

Как связать, пожалуйста, поделитесь полной информацией, а не частичной. Теперь я использую `contentType: "application/x-www-form-urlencoded", url: "/api/sitehit/LogHit/" `, и теперь он попадает, но данные не являются обязательными

Sujoy 20.01.2019 20:28

@Sujoy обновил ответ. Существует несколько способов привязки, в зависимости от типа содержимого. Используйте [FromBody] для JSON или [FromForm], если это данные формы.

haldo 20.01.2019 20:49

Зачем вы все усложняете. Я просто хочу связать его как строку, потому что мое действие контроллера принимает строку. Более того, это не проблема маршрута, потому что мой код хорошо работает с целочисленным параметром.

Sujoy 21.01.2019 17:53

Конечно, все знают, что это возможно, но вопрос в том, «как». Ваш ответ не адекватен. Я изменил вопрос, вы можете попробовать еще раз.

Sujoy 21.01.2019 18:07

Спасибо, по разному не просил. Я искал самый простой способ, возможно, с помощью строки. Я сам нашел простой способ.

Sujoy 21.01.2019 19:49

Следующий код работал:

    $.ajax({
        type: 'POST',
        //contentType: "application/json; charset=utf-8",
        url: "/api/sitehit/LogHit?Page = " + window.location.href,   
        //dataType: 'json',
        error: function (msg) {
            alert(msg.responsetext);
        }
    });

Другие вопросы по теме