c# - 使用 Ajax 将数据从视图传递到控制器
问题描述
我知道这个问题已经在这里被问过数千次了;我已经在关注我读过的很多东西,但我仍然无法让它发挥作用。
我基本上想要做的是通过使用 Ajax 向控制器发送一个 FCM 令牌(我使用基于 Layout.cshtml 的脚本获得的)。但是,该值始终为空。即使遵循正确的名称,我也无法在控制器上获取令牌数据。到目前为止,这就是我所做的。
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 名称没问题,一切正常,它应该可以工作。
任何输入表示赞赏。
谢谢
解决方案
你能在这行 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);
}}
推荐阅读
- linux - curl命令设置权限和下载文件
- blockly - 我们如何以块状创建树视图工具箱,如图像中的任何示例代码或需要文档指南
- blazor - Blazor 服务器中的侧边栏
- python - 我改变了速度以制作破折号,但想在这里添加一些破折号长度限制
- python - RASA - 聊天机器人 - 规格详情
- apache-poi - 如何使用 Apache XSSF 格式在 xlsx 的条件格式规则中启用“如果为真则停止”选项
- oracle - 仅当远程表可访问或oracle中有完整数据时才截断本地表
- python - 给定一个单词列表,为每个单词找到最短的唯一前缀
- flutter - 在底部导航栏颤动中删除底部阴影效果
- android - 设备进入深度睡眠后套接字关闭 - Android Xamarin