我可能遗漏了一些非常明显的东西,但我想要做的就是有一个简单的表格,允许它进行POST,更改其中一个字段,当它返回时它应该显示给我改变了价值。简单,对吧?
该模型如下所示:
public class TestModel
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
控制器操作:
public IActionResult Test()
{
return View(new TestModel());
}
[HttpPost]
public IActionResult Test(TestModel model)
{
model.Field1 = "changed"; // this seems to be ignored
return View(model);
}
观点:
@model AspNetCoreTest1.Models.TestModel
<form method="post" asp-controller="Home" asp-action="Test">
<input asp-for="Field1" />
<br />
<input asp-for="Field2" />
<br />
<button type="submit">Send</button>
</form>
我可以看到表单,然后POST回来(我可以看到我在模型中输入的值),但是在POST之后表单仍然显示我输入的值。它没有为第一个字段显示changed
。
(我使用的是ASP.NET Core 1.1)
思想?
答案 0 :(得分:4)
我们无法直接对传递的模型进行更改,并希望它能在UI中反映出来。您的问题的解决方案如下。
如果您使用的是C#6.0,请用以下代码替换此行代码model.Field1 = "changed";
:
ModelState.FirstOrDefault(x => x.Key == nameof(model.Field1)).Value.RawValue = "changed";
对于早期的C#版本:
ModelState.FirstOrDefault(x => x.Key == "Field1")).Value.RawValue = "changed";
答案 1 :(得分:3)
您可以致电:
ModelState.Clear();
return View(YourModel);
这将清除所有ModelState值
答案 2 :(得分:1)
注意:如果您使用的是ASP.NET输入控件,这只是一个问题。例如,如果您的HTML包含
<p>@model.Field1</p>
然后您可以更新控制器中的Field1
[HttpPost]
public IActionResult Test(TestModel model)
{
model.Field1 = "changed"; // this will update as expected
return View(model);
}
当您的HTML包含
时,您只需要使用Vadent提供的解决方案<input asp-for="Field1" class="form-control" />