确保控制器方法实际上是由 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>

在上面的代码中,我传递了错误的urlurl: '@Url.Action("Edit", "TestModels")', 正确的url 应该是url: '@Url.Action("Create", "TestModels")' 以及FirstName (First_Name) 和inp_dateid 是错误的,仍然是正确的控制器方法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 中发布

如何在 Spring MVC 中使用 AJAX 渲染视图

AJAX 和 jQuery 与 MVC

如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型

处理 Thymeleaf Spring MVC AJAX 表单及其错误消息的推荐方法

MVC:如何实现 ajax?