使用ajax在Controller中调用Action - 无法正常工作.(ASP.Net MVC)

Chr*_*Run 3 ajax asp.net-mvc asp.net-ajax episerver

我一直在冥思这个错误一段时间,并尝试了网上发现的所有建议,但仍然没有运气.

我正在对控制器的动作进行简单的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>
Run Code Online (Sandbox Code Playgroud)

控制器 - HomeController:

    [HttpPost]
    public void SetCookie()
    { 
        //Do stuff        
    }
Run Code Online (Sandbox Code Playgroud)

我做了什么/尝试过:

  1. 正确引用jquery.

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

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

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

当我运行webapplication并按下按钮时,Developer工具中的调试器告诉我

在此输入图像描述

这很奇怪,因为在HomeController中有一个名为SetCookie()的动作/方法.并显示警告框"失败",表示至少调用了js函数.

无论是我是盲人还是缺少某些东西,或者还有其他需要做的事情......

欢迎所有建议,非常感谢.

/ ChrisRun

小智 5

默认情况下,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 });
    }
Run Code Online (Sandbox Code Playgroud)

我喜欢将MVC和Web API路由放在诸如"webapi"或"api"之类的前缀下,这样它就不太可能与任何内容路由冲突.