使Ajax调用C#Controller方法

时间:2018-05-30 19:45:48

标签: javascript c# jquery asp.net ajax

这是我的javascript文件中名为“data handling.js”的代码,位于名为“JS”的文件夹中:

document.getElementById('submit-new-project').addEventListener("click", function () {
    var ProjectName = document.getElementById('new-project').value;
    if (ProjectName) {
        $.ajax({
            type: "POST",
            url: "Controllers/HomeController/AddProject",
            data: {"ProjectName": ProjectName},
            success: function () {
                hideElement("add-button-popup");
                location.reload();
            },
            error: function (errorThrown) {
                console.log(errorThrown)
            }
        });
    }
    else {
        alert("Text Field Must Not Be Empty");
    }
})

这是我的控制器方法:

public partial class HomeController : Controller
{
    [HttpPost]
    public static void AddProject(string ProjectName)
    {
        using (AutomationMethodDirectoryEntities db = new AutomationMethodDirectoryEntities())
        {
            try
            {
                PROJECT project = new PROJECT();
                project.ProjectName = ProjectName;
                db.PROJECTS.Add(project);
                db.SaveChanges();;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }
    }

控制器方法位于“Adders.cs”中,它是“Controllers”文件夹中“HomeController.cs”的部分类。 “JS”和“Controllers”文件夹都位于项目的根级别。我尝试了这个ajax调用的许多变体,我最大的问题是URL。无论我尝试什么,我总是收到404错误,因为服务器找不到请求的URL。

我已经尝试将其更改为:

url: "Controllers/HomeController/AddProject"
url: "/Controllers/HomeController/AddProject"
url: "../Controllers/HomeController/AddProject"
url: "Home/AddProject"
url: "/Home/AddProject"
url: "../Home/AddProject"
url: "@(Url.Action(AddProject, HomeController))"

我已经将“HomeController”与“Adders”换成了不同的版本。

我做错了什么?

我需要添加/更改控制器方法吗?

修改

这是我的“RouteConfig.cs”,我还没有做任何改动:

namespace RTCAD
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

1 个答案:

答案 0 :(得分:5)

调用AddProject操作时,ASP.NET MVC会创建控制器的实例(使用ControllerFactory),并且因为您的方法是静态的,所以它与任何实例无关,因此,它不会被MVC调用。

从方法声明中删除静态,并使用/Home/AddProject作为URL。