Почему некоторым методам C # api требуется [HttpPost], а некоторым - нет? - PullRequest
2 голосов
/ 24 мая 2019

У меня есть два метода в одном файле контроллера для получения данных из 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], а кому-то это не нужно?

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Наконец, я решаю эту проблему, просто прочитав статью Маршрутизация в статье ASP.NET Web API.

Поскольку мое имя метода 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 # с «Удалить» на другое и оставить метод Ajax с «POST», как показано ниже.

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);
        }
    });
}
1 голос
/ 24 мая 2019

По умолчанию API-контроллер предоставляет функции get, put, post и delete

По умолчанию Get All разрешается, скажем, IEnumerable GetAll ()

По умолчанию Get is string Get (int id)

По умолчанию Post is void Post (значение объекта [FromBody])

По умолчанию Put is void Put (int id, значение объекта [FromBody])

По умолчанию delete isvoid Delete (int id)

внимательно рассмотрим используемую подпись и типы возвращаемых данных, основанные на них, действие имеет место.

так что теперь, если вы хотите добавить новое действие, скажемПосле этого вам нужно украсить его атрибутом HttpPost для контроллера, чтобы понять, какое действие вызвать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...