【问题标题】:Why some C# api method need [HttpPost] while some don't need it?为什么有些 C# api 方法需要 [HttpPost] 而有些不需要?
【发布时间】:2019-05-24 18:28:05
【问题描述】:

我有两个方法在同一个控制器文件中从 JavaScript ajax 接收数据。

第一个 C# api 控制器代码是

public class News
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Intro { get; set; }
    public string Story { get; set; }
    public string Images { get; set; }
    public DateTime DateModified { get; set; }
    public DateTime DateCreated { get; set; }
}

public void InsertData([FromBody]News newsinfo)
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsinfo.ID > 0)
    {
        cmd.CommandText = "UPDATE [News] SET [Title] = N'" + newsinfo.Title + "', [Intro] = N'" + newsinfo.Intro + "', [Story] = N'" + newsinfo.Story + "', [Images] = N'" + newsinfo.Images + "', [DateModified] = @DateModified WHERE [ID] = " + newsinfo.ID;
        cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);

    }
    else
    {
        cmd.CommandText = "INSERT INTO [News] ([Title], [Intro], [Story], [Images], [DateCreated], [DateModified]) VALUES (N'" + newsinfo.Title + "', N'" + newsinfo.Intro + "', N'" + newsinfo.Story + "', '" + newsinfo.Images + "', @DateCreated, @DateModified)";

        cmd.Parameters.AddWithValue("@DateCreated", DateTime.Now);
        cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);
    }
    conn.Open();
    int send = cmd.ExecuteNonQuery();
    conn.Close();
}

以上代码将从这个 JavaScript 接收数据

function InsertData() {
    var newsData = {
            ID: editingID,
            Title: $("#txbTitle").val().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''"),
            Intro: $("#txbIntro").val().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''"),
            Story: $(".ql-editor").html().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''").replace(/http.\/\/[a-z:0-9]+/gm, "").replace(/\/Images.Temp\//gm, "/Images/News/"),
            Images: imagesToUpload.replace(/Temp/gm, "News")
   $.ajax({
       url: "api/Database/InsertData",
       method: "POST",
       data: newsData,
       success: function (result, status, xhr) {
           if (imagesToUpload != "") {
               var fileslist = {
                   filenames: ""
               }
               fileslist.filenames = imagesToUpload;
               console.log(fileslist);
               $.ajax({
                   url: "api/FileUpload/StoreImages",
                   method: "POST",
                   data: fileslist,
                   success: function (result, status, xhr) {
                       ViewState();
                   },
                   error: function (xhr, status, error) {
                       alert(error);
                   }
               });
           }
           else if (imagesToUpload == "") {
               ViewState();
           }
       },
       error: function (xhr, status, error) {
           alert(error);
       }
    });
}

第二个C# api控制器代码是

public class NewsId
{
    public int[] id { get; set; }
}

[HttpPost]
public void DeleteData([FromBody]NewsId newsId)
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsId.id.Length > 0)
    {
        foreach (int id in newsId.id)
        {
            cmd.CommandText = "SELECT [Images] FROM [News] WHERE [Id] = " + id;
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            string images = "";
            while (reader.Read())
            {
                images = reader[0].ToString();
            }
            conn.Close();
            string[] files = Regex.Split(images, ";");
            foreach (string file in files)
            {
                if (file != "")
                {
                    string path = HttpContext.Current.Server.MapPath("~") + Regex.Replace(file, "/Images", "Images");
                    File.Delete(path); // /Images/Temp/
                }
            }

            cmd.CommandText = "DELETE FROM [News] WHERE [Id] = " + id;
            conn.Open();
            int d = cmd.ExecuteNonQuery();
            conn.Close();
        }
    }
}

它从这个 JavaScript 接收数据

function DeletingNews(news_id) {
    var newsId = {
        id: news_id // news_id is Array 
    }
    $.ajax({
        url: "api/Database/DeleteData",
        method: "POST",
        data: newsId,
        success: function (result, status, xhr) {
            ViewState();
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}

我不明白为什么第一个代码不需要 [HttpPost] 而第二个代码需要它,否则 Ajax 将返回

405 方法不允许

现在两者都运行良好,但我只是不明白为什么有些人需要 [HttpPost] 而另一些人不需要它?

【问题讨论】:

  • 你应该放 [HttpPost] 即使它不需要..

标签: javascript c# jquery api controller


【解决方案1】:

API控制器默认提供get、put、post和delete

默认情况下 Get All 可以说是 IEnumerable GetAll()

默认Get是字符串Get(int id)

默认 Post 是 void Post([FromBody]object value )

默认情况下 Put 为 void Put(int id,[FromBody]object value )

默认删除为 void Delete(int id)

仔细查看使用的签名和返回类型 基于这些操作发生。

所以现在如果你想添加一个新动作让我们说 Post 那么你需要用 HttpPost 属性来装饰它,以便控制器了解要调用哪个动作

【讨论】:

    【解决方案2】:

    最后,我通过阅读Routing in ASP.NET Web API article. 解决了这个问题

    因为我的 C# API 方法名称以与 Http 动词规则匹配的“删除”开头。

    public void DeleteData([FromBody]NewsId newsId)
    {
        conn.ConnectionString = mdc.ConnectonString;
        cmd.Connection = conn;
        if (newsId.id.Length > 0)
    

    我只需像下面的代码一样将我的 Ajax 方法从“POST”更改为“DELETE”,然后这个问题就会得到解决。

    function DeletingNews(news_id) {
        console.log(news_id);
        var newsId = {
            id: news_id
        }
        $.ajax({
            url: "api/Database/DeleteData",
            method: "DELETE", // <-- Changed from "POST"
            data: newsId,
            success: function (result, status, xhr) {
                ViewState();
            },
            error: function (xhr, status, error) {
                alert(error);
            }
        });
    }

    或者,另一种解决方案是将 C# 方法名称从“Delete”更改为其他名称,并使用“POST”保留 Ajax 方法,如下面的代码。

    public void RemoveData([FromBody]NewsId newsId) // <-- Change method's name from "DeleteData" to "RemoveData"
    {
        conn.ConnectionString = mdc.ConnectonString;
        cmd.Connection = conn;
        if (newsId.id.Length > 0)
    

    function DeletingNews(news_id) {
        console.log(news_id);
        var newsId = {
            id: news_id
        }
        $.ajax({
            url: "api/Database/RemoveData", // <-- Change action url from "DeleteData" to "RemoveData"
            method: "POST",
            data: newsId,
            success: function (result, status, xhr) {
                ViewState();
            },
            error: function (xhr, status, error) {
                alert(error);
            }
        });
    }

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多