Передача данных из View в Controller с использованием Ajax - PullRequest
0 голосов
/ 25 февраля 2020

Я знаю, что этот вопрос задавался здесь тысячи раз; Я уже слежу за многими вещами, которые я прочитал, но я все еще не могу заставить это работать.

Что я в основном пытаюсь сделать, это отправить токен FCM (который я получил с помощью скрипта на моем База Layout.cs html) для контроллера, используя Ajax. Однако значение всегда равно нулю. Даже после правильных имен я не могу получить данные токена на контроллере. Пока все хорошо, это то, что я сделал.

HTML Страница:

    @using RazorEngine.Templating
@inherits TemplateBase

@{
    Layout = "..\\Layout.cshtml";
}
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous"></script>
<script>
    function submitForm() {
        var currToken = messaging.getToken();
        var TokenModel = new Object();
        TokenModel.RegisteredToken = currToken;
        $.ajax(
            {
                type: "POST", //HTTP POST Method
                url: "Notification/Register", // Controller/View 
                dataType: 'json',                
                data: JSON.stringify({
                    Token: TokenModel                    
                },
                success: function (status) {
                    console.log('Send');
                },
                error: function () {
                    console.log('something went wrong - debug it!');
                }
            });
    }
</script>
<div id="token"></div> 
<input type="button" value="Click" onclick="submitForm()" />

Контроллер (я отправляю все в действие регистрации)

public class NotificationController : BaseController
    {
        [HttpPost]
        [AllowAnonymous]
        public async Task<IHttpActionResult> Register(TokenModel Token)
        {

            //TokenModel currtoken = Newtonsoft.Json.JsonConvert.DeserializeObject<TokenModel>(myToken);


            string token = "agamenon";
            string secondToken = "nosferatu";
            var execCtx = this.ExecutionContext;

            var pushNotifService = execCtx.GetExtension<IPushNotificationService>(); 



            var notificationTitle = "tituloX" + new Random().Next(1000, 5000);
            var notificationBody = "someContent" + new Random().Next(91000, 95000);
            var msg = new PushNotificationMessage()
            {
                Body = notificationBody,
                Title = notificationTitle
            };
            await pushNotifService.SendMessageAsync(msg, new string[] { token,secondToken });
            //var info = await pushNotifService.GetInfoAsync(token);
            //var invalidInfo = await pushNotifService.GetInfoAsync(secondToken);
            return View();
        }

И класс TokenModel:

public class TokenModel
{
    public string RegisteredToken { get; set; }
}

Этот сайт не соответствует модели MVC, это WebAPI. Что я делаю неправильно, что я не могу получить данные, отправленные на контроллер? Имена AFAIK в порядке, все в порядке, он должен работать.

Любой вклад приветствуется.

Спасибо

1 Ответ

1 голос
/ 25 февраля 2020

Не могли бы вы показать вывод после этой строки TokenModel

TokenModel.RegisteredToken = currToken;

Например:

console.log(TokenModel);.

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

Token: JSON.stringify(TokenModel)

data: { Token: JSON.stringify(TokenModel), },


ОБНОВЛЕНИЕ:

Это Похоже, messaging.getToken() вызывает асинхронную функцию, поэтому для получения правильного значения вы можете использовать thenables, чтобы дождаться выполнения обещания или async/await.

Пример использования вашего скрипта thenables:

function submitForm() {
    messaging.getToken().then(value => {
    const TokenModel = {
      RegisteredToken = value
    }
    $.ajax({
            type: "POST", //HTTP POST Method
            url: "Notification/Register", // Controller/View 
            dataType: 'json',                
            data: JSON.stringify({
                Token: TokenModel                    
            }),
            success: function (status) {
                console.log('Send');
            },
            error: function () {
                console.log('something went wrong - debug it!');
            }
        });
    }, error => {
      console.log('messaging.getToken() fails - debug it!');
      throw new Error(error);
    }    
}

Пример использования await/async:

submitForm = async () => {
try {
    const token = await messaging.getToken();
    const TokenModel = {
    RegisteredToken = token
    };
    $.ajax({
        type: "POST", //HTTP POST Method
        url: "Notification/Register", // Controller/View 
        dataType: 'json',                
        data: JSON.stringify({
            Token: TokenModel                    
        }),
        success: function (status) {
            console.log('Send');
        },
        error: function () {
            console.log('something went wrong - debug it!');
        }
    });
} catch(error) {
    console.log('Invalid token');
    throw new Error(error);
}}
...