Ajax发布到控制器 - MVC4

时间:2013-07-10 20:36:26

标签: jquery post asp.net-mvc-4 controller

我无法使用控制器方法。我认为它可能是网址,但我尝试了不同的变体。我一直试图解决这个问题太久了。

$.ajax({
                    url: '@Url.Action("ajaxCall", "ContactForm")',                          
                    type: "POST",
                    cache: false,
                    dataType: 'json',                       
                    contentType: 'application/json; charset=utf-8',
                    data: JSON.stringify("test"),           
                    success: function () {
                        alert("success");
                    },
                    error: function () {
                        alert("fail");
                    }

                })

这是我的控制器。

    namespace form.Controllers
    {
        public class ContactFormController : Controller
        {


            [HttpPost]
            public ActionResult ajaxCall(string s)
            {            
                return Content("");
            }
    }
}

知道出了什么问题吗?

5 个答案:

答案 0 :(得分:2)

我看到您提供的示例有两个问题。

  1. 当您需要的是完全限定的网址('/ContactForm/ajaxCall'

  2. 时,URL.Action方法将仅返回'http://servername.com/ContactForm/ajaxCall'
  3. 客户端javascript期望服务器发送回JSON,并且您的控制器操作正在返回HTML。更改控制器操作以返回'JsonResult',它应该可以正常工作,我测试过。

答案 1 :(得分:0)

请勿在{{1​​}}的调用中指定“控制器”一词:

@Url.Action()

它不是在寻找类名,它正在寻找 controller 名称,而在ASP.NET MVC约定中,“Controller”这个词是类名的一部分,表示它是一个控制器,否则在这种情况下命名为“ContactForm”。

答案 2 :(得分:0)

如果大卫的回答没有让你一直到那里(一定要查看渲染的页面,看看它输出的确定),尝试将Razor代码包装在大括号中:

@{Url.Action("ajaxCall", "ContactForm")}

答案 3 :(得分:0)

你试过了吗?

url: '@Url.Action("ajaxCall", "ContactForm")

您不应该指定控制器类的全名。您也可以尝试路线名称。

答案 4 :(得分:0)

尝试发布像这样的javascript对象:

var value = { s : 'Test string' }

在ajax电话上:

data: JSON.stringify(value)

因此模型绑定器会找到一个's'属性来映射到's'参数。

根据dataType ajax选项,您应该从操作中返回JsonResult:此选项是从服务器收到的预期响应类型。