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

Asp.net mvc 5 在回发时更新已发布的表单值而不丢失验证消息,asp.net-mvc-5,Asp.net Mvc 5,我遇到了一个与此相关问题中发布的问题类似的问题: 因为我想比“nuke it all”更有针对性,所以我使用了ModelState.Remove(“propertyname”)来影响模型中的特定值 然而,这对于我想要的内容来说太宽泛了,因为这会删除任何可能为该属性累积的验证信息等 如何更新特定的回发值而不丢失所有其他有用的状态信息? 以下代码显示当前行为(不需要的行为以粗体显示): 提交“test”将返回一个带有“replacement”的模型,但是一个带有 “测试” 提交“testlong

我遇到了一个与此相关问题中发布的问题类似的问题:

因为我想比“nuke it all”更有针对性,所以我使用了
ModelState.Remove(“propertyname”)
来影响模型中的特定值

然而,这对于我想要的内容来说太宽泛了,因为这会删除任何可能为该属性累积的验证信息等

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

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

  • 提交“test”将返回一个带有“replacement”的模型,但是一个带有 “测试”
  • 提交“testlong”将返回一个带有“replacement”的模型,但返回一个表单 使用“testlong”,并显示验证消息
  • 提交“删除”将返回带有“替换”的模型,并返回带有 “替换”
  • 提交“removelong”将返回一个带有“replacement”的模型,并返回表单 带有“替换”且没有验证消息
型号:

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;}
@Html.ValidationMessageFor(m=>m.A)
@Html.TextBoxFor(m=>m.A)
以下是一些有用的示例:

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

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

但是,如果您确实想这样做,可以使用以下方法,而不是使用
Model.Remove(“propertyName”)

或者以另一种形式

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

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

但是,如果您确实想这样做,可以使用以下方法,而不是使用
Model.Remove(“propertyName”)

或者以另一种形式

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

你想要的行为毫无意义。如果用户提交了一个无效值,那么它当然应该返回相同的无效值以及与该值相关的验证错误。@StephenMuecke我同意这种行为在传统形式下没有什么意义。我的用例与我在这里介绍的MCV有很大的不同。然后展示你的真实用例!(你的问题毫无意义)@StephenMuecke MCVE的全部意义在于它清楚地展示了所讨论的行为,而不是它代表了生产代码。不管这个例子有多做作,它都是有效的,是明确的,问题也是如此。那么你期望答案是什么?你甚至同意你想要的行为没有意义。你想要的行为没有意义。如果用户提交了一个无效值,那么它当然应该返回相同的无效值以及与该值相关的验证错误。@StephenMuecke我同意这种行为在传统形式下没有什么意义。我的用例与我在这里介绍的MCV有很大的不同。然后展示你的真实用例!(你的问题毫无意义)@StephenMuecke MCVE的全部意义在于它清楚地展示了所讨论的行为,而不是它代表了生产代码。不管这个例子有多做作,它都是有效的,是明确的,问题也是如此。那么你期望答案是什么呢?你甚至同意你想要的行为毫无意义。
ModelState propertyState;
if (ModelState.TryGetValue("propertyName"))
{
    propertyState.Value = null;
}