Действие контроллера не выполняется как HttpPut, но будет выполняться как HttpPost - PullRequest
1 голос
/ 05 июля 2019

Я создаю простой маленький веб-сайт, который взаимодействует с веб-API, который позволяет пользователям иметь базу данных emus.В настоящее время я работаю над действием PUT в контроллере.Сначала пут идет от действия, которое просто перенаправляет к новому представлению.Затем это представление запрашивает у пользователя информацию и возвращает ее в модель.Затем второе действие должно обрабатывать информацию и вызывать API.

Первое и второе Action имеют одинаковые имена, поэтому второе действие, обрабатывающее запрос API, имеет тег [HttpPut] сверху.Однако, если у него есть этот тег, то представление никогда не переходит ко второму действию - оно просто перезагружает страницу, когда я нажимаю «отправить».Однако, если я добавлю [HttpPost], он будет работать нормально.

Я уже пытался изменить конфигурацию в IIS Express, но безрезультатно.

Вот код для представления:

@model HelloEmuWebsite.Models.EmuItem
@using (Html.BeginForm())
{

    <div>
        @Html.LabelFor(x => x.SearchName)
        @Html.TextBoxFor(x => x.SearchName)
    </div>
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.TextBoxFor(x => x.Name)
    </div>
    <div>
        @Html.LabelFor(x => x.Age)
        @Html.TextBoxFor(x => x.Age)
    </div>
    <div>
        @Html.LabelFor(x => x.Weight)
        @Html.TextBoxFor(x => x.Weight)
    </div>

    <input type="submit" value="OK" />


}

А вот код в контроллере:

public IActionResult ChangeOneEmu()
        {
            return View(new EmuItem());   
        }

        [HttpPut]
        async public Task<IActionResult> ChangeOneEmu(EmuItem model)
        {
            var baseAddr = new Uri("my_url/api/values/");
            var client = new HttpClient { BaseAddress = baseAddr };
            var response = await client.PutAsJsonAsync(model.SearchName, model);
            return RedirectToAction("Index");
        }

А вот код запроса PUT в моем пользовательском API:

 [HttpPut("{id}")]
        public ActionResult<List<Models.EmuItem>> Put(string id, [FromBody] Models.EmuItem ChangedEmu)
        {
            if (ModelState.IsValid)
            {
                return MyEmus.ChangeEmu(id, ChangedEmu);

            }

            return BadRequest(ModelState);
        }

Почемуэто происходит?Как я могу это исправить, чтобы он принимал [HttpPut]?В качестве альтернативы, есть ли лучший способ сделать это, не опираясь на теги [http]?Спасибо!

1 Ответ

1 голос
/ 06 июля 2019

Браузеры поддерживают только GET и POST для отправки форм.Единственными допустимыми значениями для атрибута метода являются get и post, соответствующие HTTP-методам GET и POST.<form method="put"> является недействительным HTML и будет обрабатываться как <form>, то есть отправлять запрос GET.Вы можете использовать AJAX для отправки запроса PUT на Controller:

. Вы можете назначить id элементу form и button, а затем отправить данные модели следующим образом:

$(document).ready(function () {
   $("#btnid").click(function () {
        $.ajax({
            url: '@Url.Action("ChangeOneEmu", "Home")',
            type: 'PUT',
            data: $('#formid').serialize(),
            dataType: 'json',
            success: function(result) {      
            }
        });
        return false;
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...