确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的
Posted
技术标签:
【中文标题】确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的【英文标题】:assure that the controller method is actually called by ajax or by POST request in mvc 【发布时间】:2021-12-06 07:22:43 【问题描述】:我正在测试我的代码,将数据从视图页面传递到控制器创建方法。我尝试使用ajax
传递数据,但我如何确定我的控制器方法确实是由 ajax 函数调用,而不是由 POST 请求方法调用。
当我在ajax
中更改url
或在ajax
方法中将错误的id
值作为输入传递时,仍会调用控制器方法并将响应消息返回给ajax
函数。
让我给你看我的 ajax 代码:
<script>
$(document).ready(function ()
$('#btn_submit').click(function ()
var testModel =
FirstName: $('#First_Name').val(),
LastName: $('#LastName').val(),
Gender: $("input[name='Gender']:checked").val(),
Contact: $('#Contact').val(),
Faculty: $('#Faculty').val(),
RegNepaliDate: $('#inp_date').val()
;
alert(JSON.stringify(testModel));
$.ajax(
type: 'POST',
url: '@Url.Action("Edit", "TestModels")', /*"/TestModels/Create",*/
data: JSON.stringify(testModel),
contentType: 'application/json;charset=utf-8',
dataType: 'json',
success: function (data)
if (response.success)
alert(response.responseText);
,
error: function (req, status, error)
console.log(error);
)
)
)
</script>
在上面的代码中,我传递了错误的url
即url: '@Url.Action("Edit", "TestModels")',
正确的url 应该是url: '@Url.Action("Create", "TestModels")'
以及FirstName
(First_Name) 和inp_date
的id
是错误的,仍然是正确的控制器方法TestModels/Create
被调用并返回成功响应。
我的控制器方法:
// POST: TestModels/Create
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create(TestModel testModel, string LastName, string RegNepaliDate)
if (ModelState.IsValid)
//return null;
//db.TestModels.Add(testModel);
//db.SaveChanges();
//return Json("true", JsonRequestBehavior.AllowGet);
return Json(new success = true, responseText = "Your message successfuly sent!" , JsonRequestBehavior.AllowGet);
//return Json("false", JsonRequestBehavior.DenyGet);
return Json(new success = false, responseText = "Error." , JsonRequestBehavior.AllowGet);
我在视图页面中的提交按钮代码:
@using (html.BeginForm())
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>TestModel</h4>
<hr />
@Html.ValidationSummary(true, "", new @class = "text-danger" )
// input form
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" id="btn_submit" />
</div>
</div>
</div>
我很惊讶这是怎么可能的,在教程中他们只展示了如何通过 ajax 将数据从视图传递到控制器,但他们从未展示如何检查它是否真的是一个 ajax 调用或 POST 请求。请解释我如何检查这个。谢谢!!!
【问题讨论】:
我猜第一条线索是......当你点击你的#btn_submit
按钮时,页面是重新加载还是导航到一个新页面?如果是这样,那么您没有使用 AJAX。
这能回答你的问题吗? Is there any attribute relating to AJAX to be set for ASP.NET MVC controller actions?
使用来自this answer 的[AjaxOnly]
属性将您的操作限制为仅允许来自ajax 调用。
看起来你没有取消提交,所以你得到了 ajax 和表单发布。而不是 $('#btn_submit').click
钩入表单提交:$("form").submit(function() ...ajax call... return false; );
【参考方案1】:
这是由于@using (Html.BeginForm())。因此,您的 ajax 方法不起作用。
当您在没有任何参数的情况下调用 BeginForm() 时,它默认使用与呈现当前页面相同的控制器/动作。
请参考:(How does @Html.BeginForm() works?)
如果你想调用 ajax 方法然后删除 Html.BeginForm() 语法
【讨论】:
以上是关于确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ajax get 将数据从 View 传递到 Controller 或使用参数在 mvc 中发布
如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型