C# 使用Ajax C在不同的控制器/动作中调用动作#

C# 使用Ajax C在不同的控制器/动作中调用动作#,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我有\u布局文件,我想在我的项目的不同页面上显示什么 \u layout.cshtml <html> xxxxx </html> 在我的\u布局中添加了以下行: @{Html.RenderAction("BarraNavegacion", "NavBar");} 目前一切正常,导航栏显示良好 我的导航栏有一个注销按钮,所以我尝试使用ajax实现注销方法 脚本注销 //Boton salir $('.salirUsuario').click(function()

我有
\u布局
文件,我想在我的项目的不同页面上显示什么

\u layout.cshtml

<html>
xxxxx
</html>
在我的
\u布局中
添加了以下行:

@{Html.RenderAction("BarraNavegacion", "NavBar");}
目前一切正常,导航栏显示良好

我的导航栏有一个注销按钮,所以我尝试使用ajax实现注销方法

脚本注销

//Boton salir
    $('.salirUsuario').click(function() {

        console.log("salio");

        $.ajax({
            url: 'LogOut',
            method: "POST",
            data: { data: "xx" },
            async: false,
            dataType: "json",
            success: function (json) {

                window.location.href = '@Url.Action("Login","Login")';
            }
        });
但收到以下控制台错误

jquery-3.4.1.min.js:2 POST http://localhost:9887/Home/LogOut 404 (Not Found)

我知道应用程序试图在“
Home
”中找到方法/操作“
LogOut
”(这是我目前所在的视图),但如何转到我创建的名为
NavBar
的控制器的导航栏/注销,而不转到“
Home
或者我当时所在的任何其他视图?

如果您想为以下几个视图包括导航栏,可以添加以下行

@Html.Partial("~/Views/Controller/View.cshtml", model)
假设您想在主布局页面中使用它,请在
\u layout.chtml
中添加上述代码,您可以调用以下代码来呈现主布局

@{
Layout = "~/Views/Shared/_layout.cshtml";
}
对于注销,只需执行以下脚本

 $('.salirUsuario').click(function() {
      window.location.href = '/NavBar/LogOut';          
 });

您想要发布到的注销操作位于
NavBarController
上,但在您当前的AJAX函数中,asp.net MVC框架将尝试在默认控制器路径上找到
LogOut
路径,该路径是您的“主”控制器,因为您正在将AJAX URL属性设置为
URL:“LogOut”
。您需要更具体地了解URL中的路由位置

对于Razor页面javascript:

您的AJAX Url需要包含控制器路径,因此如果此javascript位于razorpage(.cshtml)文件中,您可以执行以下操作:


对于引用的javascript文件:

如果您的javascript代码位于单独的javascript文件中并被引用,那么您可以在布局页面中为应用程序的基本URL路径创建一个变量,然后,您可以在任何包含的javascript文件中使用该变量,只要在添加任何
script
标记以引用javascript文件之前在布局页面中声明该变量即可

布局页面文件第一个
脚本
标记可以是:

<script type="text/javascript">
    var baseApplicationPath = '@Url.Content("~/")';
</script>

我认为你没有抓住重点。您的局部视图与您的操作方法以及如何实现它们无关。只要正确定义了路由,就可以使用AJAX调用任何控制器的任何操作方法并在那里处理逻辑。从技术上讲,您可以调用
主页
控制器的
注销
方法,根据您的逻辑,您可以发回注销状态,并在
视图
上执行适当的重定向。您还应阅读此答案以了解更多信息:
    $.ajax({
        url: '@Url.Content("~/NavBar/LogOut")',
        method: "POST",
        data: { data: "xx" },
        async: false,
        dataType: "json",
        success: function (json) {

            window.location.href = '@Url.Action("Login","Login")';
        }
    });
<script type="text/javascript">
    var baseApplicationPath = '@Url.Content("~/")';
</script>
    $.ajax({
        url: baseApplicationPath + 'NavBar/LogOut',
        method: "POST",
        data: { data: "xx" },
        async: false,
        dataType: "json",
        success: function (json) {
            window.location.href = baseApplicationPath + 'Login/Login';
        }
    });