Вызов C # Web Api не вызывается из jquery - PullRequest
0 голосов
/ 20 января 2019

Я выполняю вызов POST web-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);
}

код C #

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

Ответы [ 2 ]

0 голосов
/ 21 января 2019

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

    $.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);
        }
    });
0 голосов
/ 20 января 2019

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

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

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

Или (при условии, что на контроллере нет других методов HttpPost) измените jQuery url на 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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...