在回发时更新已发布的表单值而不丢失验证消息

时间:2017-11-30 22:40:24

标签: asp.net-mvc-5

我遇到了与此相关问题类似的问题: mvc 4 textbox not updating on postback

因为我想要比#34更有针对性,所以"我使用ModelState.Remove("propertyname")代替只影响模型中的特定值。

然而,即使这对我想要的东西来说太广泛了,因为这会删除可能已经为此属性产生的任何验证信息等。

如何在不丢失所有其他有用状态信息的情况下更新特定的回发值?

以下代码显示当前行为(以粗体显示不需要的行为):

  • 提交"测试"返回一个带有"替换", 的模型,但是带有一个表单 "测试"
  • 提交" testlong"使用"替换", 返回一个模型,但是一个表单 使用" testlong" ,并显示验证消息
  • 提交"删除"返回一个带有" replacement"的模型,并用 "替换"
  • 提交" removelong"返回带有" replacement"和form的模型 用"替换" 且无验证消息

型号:

public class TestViewModel
{
    [StringLength(7, ErrorMessage = "{0} must be less than {1} characters")]
    public string A { get; set; }
}

动作:

public ActionResult Test(TestViewModel model)
{
    if(model.A == "remove" || model.A == "removelong")
    {
        ModelState.Remove("A");
    }
    model.A = "replacement";
    return View(model);
}

查看:

@model TestNamespace.TestViewModel
@{ Layout = null; }

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form>
        @Html.ValidationMessageFor(m=>m.A)
        @Html.TextBoxFor(m => m.A)
    </form>
</body>
</html>

这有用的一些例子:

  • 告诉用户他们出了什么问题,为他们修理并告诉他们 他们我们修好了。
  • 一个应用程序,记录验证错误以进行分析,并且始终如此 这是视图之前的最后一步,以便捕获验证 在行动期间添加了错误。
  • 经理/客户强制要求的逻辑是荒谬的,但仍然需要尽管有这方面的建议。

1 个答案:

答案 0 :(得分:0)

没有明确的方法可以做到这一点,因为在99%的情况下这是一个X-Y问题(例如,想要这样做的原因是有缺陷的)。

但是,如果您真的想这样做,可以使用以下内容而不是Model.Remove("propertyName")来执行此操作:

ModelState propertyState = ModelState["propertyName"];
if (propertyState != null)
{
    propertyState.Value = null;
}

或其他形式

ModelState propertyState;
if (ModelState.TryGetValue("propertyName"))
{
    propertyState.Value = null;
}