我有以下模型:
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>
无论我进行什么更改,我总是会返回 initial Day
值,并将null
设为Field
,就像Model
一样从未改变过……
那么如何将 修改后的模型 发回到我的控制器上?
答案 0 :(得分:1)
您的表单正在提交视图第一次加载时在页面上呈现的隐藏字段中的值,然后它们从未被修改(这就是为什么您看到Day
和{{ 1}})。您的可编辑字段不在表单中,而是您正在编辑的字段,但它们从未提交给服务器。我认为这里的主要收获是表单仅知道其中存在的输入(除非您编写一些javascript魔术来处理此问题,但在这种情况下没有理由这样做)
您需要删除隐藏的字段,并将可编辑字段放入表单中,如下所示:
Field
您还可以将控制器操作更改为:
@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>