使用 ajax 在 Controller 中调用 Action - 不起作用。 (ASP.Net MVC)

Invoking Action in Controller using ajax - not working. (ASP.Net MVC)

我已经安静地解决这个错误一段时间了,并尝试了在网上找到的所有建议,仍然没有运气。

我正在对控制器的操作进行简单的 ajax 调用。该应用程序在 EPiServer 中,但这似乎是关于在 ASP.NET 中使用 Ajax 的一般问题。

索引视图:

<input id="btnAjax" type="button" value="Favorite" />

<script>
    $('#btnAjax').click(function () {
        $.ajax({
            url: '@Url.Action("SetCookie", "Home")',
            contentType: 'application/html; charset=utf-8',
            type: 'POST',
            dataType: 'html'    
        })
        .success(function (result) {
            alert("Success");
        })
        .error(function (xhr, status) {
            alert(status);
        })
    });
</script>

控制器 - 家庭控制器:

    [HttpPost]
    public void SetCookie()
    { 
        //Do stuff        
    }

我有done/tried:

  1. 正确引用 jquery。

  2. 向操作添加了 [WebMethod] 属性

  3. 在Web.config中添加了一个 Http 模块(ScriptModule,用于 EPiServer)

  4. 在 jquery.

  5. 之后添加了对 jquery.unobtrusive-ajax.js 的引用

当我 运行 Web 应用程序并按下按钮时,Developer 工具中的调试器告诉我

这很奇怪,因为在 HomeController 中有一个名为 SetCookie() 的 action/method。并且出现警告框"Fail",说明至少调用了js函数

要么我瞎了,错过了什么,要么还有其他事情需要做...

欢迎并非常感谢所有建议。

/克里斯润

EPiServer默认没有为MVC注册默认路由。这是因为您的站点中可能有一个名为 "Home" 的页面与 Home 路由冲突。您可以通过覆盖 RegisterRoutes 方法在 Global.asax 中自己注册路由:

protected override void RegisterRoutes(RouteCollection routes)
    {
        base.RegisterRoutes(routes);

        // Register a route for Web API
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "webapi/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Register a route for classic MVC to use for API calls
        routes.MapRoute(
            name: "API",
            url: "api/{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional });
    }

我喜欢将 MVC 和 Web API 路由放在 "webapi" 或 "api" 等前缀下,这样它就不太可能与任何内容路由发生冲突。

简单地改变你的方法:

public void SetCookie()
{ 
    //Do stuff        
}

对此:

public ActionResult SetCookie()
{ 
    //Do stuff        
}