Я делаю вызов 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
}
}
Взгляните на stackoverflow.com/questions/19093603/simple-post-to-web-api..
Также убедитесь, что ваша настройка маршрутизации верна, поскольку для методов не указан атрибут маршрута...





В контроллере не задан маршрут для /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 обновил ответ. Существует несколько способов привязки, в зависимости от типа содержимого. Используйте [FromBody] для JSON или [FromForm], если это данные формы.
Зачем вы все усложняете. Я просто хочу связать его как строку, потому что мое действие контроллера принимает строку. Более того, это не проблема маршрута, потому что мой код хорошо работает с целочисленным параметром.
Конечно, все знают, что это возможно, но вопрос в том, «как». Ваш ответ не адекватен. Я изменил вопрос, вы можете попробовать еще раз.
Спасибо, по разному не просил. Я искал самый простой способ, возможно, с помощью строки. Я сам нашел простой способ.
Следующий код работал:
$.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);
}
});
Не полезно. Я вызываю
API/Controller/Action/StringData, но все равно безрезультатно