ASP.NET核心 - 在帖子后更改表单值

时间:2017-01-21 04:31:14

标签: asp.net-core asp.net-core-mvc

我可能遗漏了一些非常明显的东西,但我想要做的就是有一个简单的表格,允许它进行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)

思想?

3 个答案:

答案 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" />