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

时间:2015-10-26 09:49:27

标签: 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>

控制器 - HomeController:

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

我做过/尝试过的事情:

  1. 正确引用jquery。

  2. 将[WebMethod]属性添加到操作

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

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

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

    enter image description here

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

    要么我失明了,要么缺少某些东西,或者还有其他需要做的事情......

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

    / ChrisRun

2 个答案:

答案 0 :(得分:5)

默认情况下,EPiServer不会为MVC注册默认路由。这是因为你可以有一个名为&#34; Home&#34;在您的网站中与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路由放在&#34; webapi&#34;等前缀下。或&#34; api&#34;这样它就不太可能与任何内容路由冲突。

答案 1 :(得分:0)

只需更改您的方法:

public void SetCookie()
{ 
    //Do stuff        
}

到此:

public ActionResult SetCookie()
{ 
    //Do stuff        
}