Как передать измененную модель обратно в контроллер в ASP.NET Core - PullRequest
0 голосов
/ 11 июня 2019

У меня есть следующая модель:

public class Card
{        
    [DataType(DataType.Date)]
    [BindProperty]
    public DateTime Day { get; set; }

    [BindProperty]
    public string Field { get; set; }
}

Следующий контроллер:

// GET: Card
public async Task<IActionResult> Index(DateTime? day)
{
    return View(model);
}

public async Task<IActionResult> Refresh(DateTime? Day, string Field)
{
     return RedirectToAction("Index", Day);
}

Следующий вид:

@model Card

<h1>Cards</h1>
<div class="text-center">
    <label asp-for="Day" class="control-label"></label>
    <input asp-for="Day" class="form-control" />
</div>
<div class="text-center">
    <label asp-for="Field" class="control-label"></label>
    <select asp-for="Field" class="form-control" asp-items="ViewBag.Fields"></select>
</div>
<form asp-action="Refresh">
    @Html.HiddenFor(x => x.Day)
    @Html.HiddenFor(y => y.Field)
    <input type="submit" value="Refresh" class="btn btn-default" />
</form>

Независимо от того, что я изменяю, я всегда получаю начальное Day значение обратно и null как Field, как Model, никогда не менялось…

Так, как я могу отправить модифицированную модель на мой контроллер?

1 Ответ

1 голос
/ 11 июня 2019

ваша форма отправляет значения из скрытых полей, которые отображаются на странице при первой загрузке представления, а затем никогда не изменяются (именно поэтому вы видите инициализацию по умолчанию для Day и Field),Ваши редактируемые поля находятся вне формы и являются тем, что вы редактируете, но они никогда не отправляются на сервер.Я думаю, что основной вывод здесь для вас заключается в том, что формы знают только о входных данных, которые существуют внутри них (если вы не пишете магию javascript, чтобы справиться с этим, но в этом случае нет причин делать это)

Вам нужночтобы удалить скрытые поля и поместить ваши редактируемые поля внутри формы следующим образом:

@model Card

<h1>Cards</h1>

<form method="post" asp-action="Refresh">
    <div class="text-center">
        <label asp-for="Day" class="control-label"></label>
        <input asp-for="Day" class="form-control" />
    </div>
    <div class="text-center">
        <label asp-for="Field" class="control-label"></label>
        <select asp-for="Field" class="form-control" asp-items="ViewBag.Fields"></select>
    </div>

    <input type="submit" value="Refresh" class="btn btn-default" />
</form>

, вы также можете изменить действие вашего контроллера на:

[HttpPost]
public async Task<IActionResult> Refresh(Card card)
{
     return RedirectToAction("Index", card.Day);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...