Asp.net Core Migration, действия Post больше не работают - PullRequest
0 голосов
/ 14 декабря 2018

Я перенес проект Asp.Net в .Net Core и заметил, что моя конечная точка POST больше не работает.

    [HttpGet, Route("Concert/Add/{eventId:int?}")]
            public ActionResult Add(int eventId)
            {
//This works
    }

     [HttpPost]
            [Route("Concert/Add")]
            public IActionResult Add(EntryViewModel entryViewModel)
            {
//This action is never reached. I get a 404 Not found in browser
    }

На мой взгляд, у меня есть следующая форма:

  @using (Html.BeginForm("Add", "Concert", new { eventId = Model.EventId }, FormMethod.Post, null, new { @class = "center-block entryform AddEntry" }))
    {
  <div class="form-group">
            @Html.LabelFor(model => model.Forename, new { @class = "control-label entryLabel" })
            <div class="">
                @Html.TextBoxFor(model => model.Forename, new { @class = "form-control" })
            </div>
        </div>
    }

Мой StartUp.cs Configure () выглядит следующим образом:

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "Events",
                    template: "{controller=Home}/{action=Index}/{eventId?}");
            });

Если я изменю свой маршрут к конечной точке Post на [Route ("Customer / Add / {entryViewModel})"], то он перейдет к этомудействие, но модель является нулевой.Я пропустил другую конфигурацию?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Используйте [FromBody] для параметра

 [HttpPost]
 [Route("Concert/Add")]
 public IActionResult Add([FromForm]EntryViewModel entryViewModel)
 {

 }

А также вижу:

new { eventId = Model.EventId }

Итак, лучше

 [HttpPost]
 [Route("Concert/Add/{eventId:int}")]
 public IActionResult Add(int eventId,[FromForm]EntryViewModel entryViewModel)
 {

 }
0 голосов
/ 14 декабря 2018

Похоже, у вас есть опечатка на маршруте, конечная точка не будет нажата.

[Route("Convert/Add/{entryViewModel}")]

Это должно быть

[Route("Concert/Add/{entryViewModel}")]

Я бы тоже удалил new { eventId = Model.EventId }в @Html.BeginForm, чтобы убедиться, что EntryViewModel сериализован и правильно передан к конечной точке HTTP.

Дополнительно, так как вы не указали свой класс EntryViewModel, я бы гарантировал, что он имеет правильный получательи сеттеры, связанные для работы привязки модели, например:

public class EntryViewModel
{
   [Required]
   [DisplayName(Name="Forename")]
   public string Forename { get; set; }
}

И в вашей форме вы можете использовать ASP.NET Core Tag Helpers.

<form asp-controller="Concert" asp-action="Add" method="post">
    Forename:  <input asp-for="Forename" /> 
    <br />
    <button type="submit">Submit</button>
</form>
...