当通过AJAX调用时,控制器操作不会执行

Controller action does not execute when called via AJAX

本文关键字:操作 控制器 执行 AJAX 调用      更新时间:2023-09-26

我有两个名为Contact和About的HttpPost控制器操作。我有一个JavaScript函数,它将把相关的表单属性(其操作、方法等)转换为AJAX请求,然后对返回值/响应进行处理。

然而,当我调用JavaScript函数时,只有JavaScript部分运行,并且没有调用MVC服务器端代码。

有人能帮忙吗?

联系

[HttpPost]         
public string Contact(string id)
{
    return "OK";
}

关于

[HttpPost]
public string About(string id)
{
    return "OK2";
}

脚本

 $('form').submit(function () {
    if ($(this).valid()) {
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (result) {
                $('#myForm').html('');
                $('#result').html(result);
            }
        });
    }
    return false;
});

});

假设以下内容,因为问题没有提到细节。。。

我想你的页面结构是这样的:

<body>
   <form action="/Home/About" method="POST">
     <input type="hidden" name="id" value="1">
     <button type="submit">About</button>
   </form> | 
   <form action="/Home/Contact" method="POST">
     <input type="hidden" name="id" value="2">
     <button type="submit">Contact</button>
   </form>
   <div id="result"></div>
</body>

<body>
   <form action="/Home/About/?id=1" method="POST">
     <button type="submit">About</button>
   </form> | 
   <form action="/Home/Contact/?id=2" method="POST">
     <button type="submit">Contact</button>
   </form>
   <div id="result"></div>
</body>

如果是这样的话,它应该会起作用。

请注意,每个表单都包含一个名为id的输入元素,或者id作为querystring附加在表单action属性中。这一点非常重要,因为MVC路由和模型绑定依赖于此,因为您的控制器操作需要一个id参数。即CCD_ 1。

还要确保您的操作是正确的形式,即如果您使用默认操作,请确保控制器名称是路由的一部分(即,如果您的控制器名为HomeController,并且您的操作为联系),MVC将期望此特定路由(如果使用包罗万象的路由:/Home/Contact。如果您正在使用自定义路由条目,则忽略此项。

服务器端操作可能未命中的另一个原因是由于您的表单方法。您的示例预期为POST,但如果您的表单方法是PUTGET或者其他什么,它也不会命中它。

如果你坚持这三件事,你可能不会有问题。