【问题标题】:ASP.NET Core - Changing form values after a postASP.NET Core - 发布后更改表单值
【发布时间】:2021-03-24 12:56:16
【问题描述】:

我可能遗漏了一些非常明显的东西,但我想做的只是有一个简单的表单,允许它发布,更改其中一个字段,当它返回时它应该向我显示更改后的值。很简单吧?

模型如下所示:

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 之后表单仍然显示我输入的值。它不会在第一个字段中显示 changed

(我使用的是 ASP.NET Core 1.1)

想法?

【问题讨论】:

  • 尝试从HttpGet中删除return View(new TestModel());.. 保留return View()
  • 刚试过;一样的
  • 你能在视图中放置一个调试器来查看你是否得到更新的模型值吗?
  • 哈!我不知道您可以在 HTML 中设置断点,很好 :) 是的,我刚刚这样做了,Field1 显示为“已更改”。好奇怪……

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


【解决方案1】:

我们不能直接对传递的模型进行更改,希望它能反映在 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";

【讨论】:

  • 好的...您的代码有效,但至少可以说不直观(评论框架,而不是您的答案)。官方文档在 POST 上将模型传递回视图 (docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/…)。我只是尝试在没有模型的情况下简单地传递 View() 并且这也有效;考虑到你所说的,这是有道理的。以这种方式工作有什么好处?
  • 阅读 @CodeCaster 的链接后,现在可以理解幕后发生的事情了。我仍然认为这是一个糟糕的设计决定。感谢你们俩的帮助
【解决方案2】:

你可以打电话:

ModelState.Clear();
return View(YourModel);

这将清除所有 ModelState 值

【讨论】:

    【解决方案3】:

    注意:这仅在您使用 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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多