【问题标题】:Show validation message, but clear value显示验证消息,但清除值
【发布时间】:2012-07-11 22:46:02
【问题描述】:

我一直在四处寻找,但无法找到看似简单的要求的答案:

使用 MVC Data Annotation 验证,是否可以在验证摘要或字段旁边显示验证消息('必须是最大长度为 5 的字符串'),但清除文本框的值(验证失败时) )。

我尝试使用 ModelState.Clear()ModelState.Remove("CompanyName"),但这会清除 值和验证消息(验证状态)。

我问这个问题是因为最近我们进行了一次渗透测试,其中一项建议是如果验证失败,则不要预填充安全值(信用卡号等)。这显然是一个小问题,但建议是如果我们没有必要,不要通过互联网(从服务器)发回值。

这是我正在使用的代码:

public ActionResult Edit()
{
    return View();
}

[HttpPost]
public ActionResult Edit(CompanyInput input)
{
    if (ModelState.IsValid)
    {
        return View("Success");
    }
    //ModelState.Clear // clears both the value and validation message
    //ModelState.Remove("CompanyName") // same result
    return View(new CompanyInput());
}

还有视图模型:

public class CompanyInput
{
    [Required]
    [StringLength(5)]
    public string CompanyName { get; set; }

    [DataType(DataType.EmailAddress)]
    public string EmailAddress { get; set; }
}

还有观点:

@model Test.Models.CompanyInput

<h2>Edit</h2>

@using (Html.BeginForm("Edit", "Company"))
{
    @Html.EditorForModel()
    <button type="submit">Submit</button> 
}

【问题讨论】:

  • 看到“预填充”值真的很奇怪,因为如果模型无效,则返回空(新 CompanyInput())模型作为视图结果。你确定你发布了正确的代码示例吗?
  • @alexanerb 是的,我的想法完全正确。是的,代码示例是正确的。我也觉得很奇怪。
  • 检查 HTML,输入的值是否已初始化???也可能是浏览器正在缓存输入字段。
  • @alexanderb 好声音,我将通过代理运行并检查一下。但是,我注意到,如果我执行 @Html.PasswordFor(m =&gt; m.CompanyName),则该值会被清除。

标签: c# asp.net-mvc validation asp.net-mvc-4 data-annotations


【解决方案1】:

每个字段的 ModelState 不仅仅包含值,因此将其从集合中完全删除会按预期删除您的错误消息。我相信你应该能够通过做类似的事情来清除价值。

ModelState["CompanyName"].Value = null;

编辑:经过仔细检查,我发现 Value 属性的类型为 ValueProviderResult,只是将其归零并不会给出所需的结果,而且因为此类的属性似乎是 getter只有你必须用你自己的替换实例。我已经测试了以下内容,它对我有用。

ModelState["CompanyName"].Value = new ValueProviderResult(string.Empty, string.Empty, ModelState["CompanyName"].Value.Culture);

【讨论】:

  • 我刚刚试了一下。这仍然显示了我在验证失败时输入的 attempted 值。因为我使用的是@Html.EditorForModel,所以我想我遇到了这里描述的问题:forums.asp.net/p/1527149/3687407.aspx。但是,我想知道我是否缺少明显的东西。
  • 啊对不起我的错。我没有仔细观察 Value 属性的数据类型。这是ValueProviderResult。然而,这个属性似乎只是吸气剂。所以你必须用一个新实例替换它才能获得你想要的行为。检查我更新的答案。
【解决方案2】:

因为 ModelState 无效,您必须创建自定义验证器或 jQuery ajax/json 调用来确定是否需要清除数据。

只是将模型属性更改为 string.Empty 或类似的东西不会起作用,因为整个视图会使用先前成功发布的模型重新渲染,但会出现 ModelState 验证错误。

【讨论】:

  • 是的,我认为这就是问题所在。那么,自定义验证器会重置RawValue 属性吗?这看起来如何?
  • 此外,jquery 调用(据我所知)仍会将输入值从服务器返回。
【解决方案3】:

是的,您可以添加这样的错误消息

[Required(ErrorMessage = "must be a string with a maximum length of 5")]

在 OP 明确后更新:

清除例如Input.Field = string.Empty;

【讨论】:

  • 我认为您没有理解我的问题,如果我不清楚,请见谅。即使我更改了错误消息,我输入的值(验证失败)也会预先填充在文本框中。我想显示验证消息,但清除文本框中的值(验证失败时)。
  • 我把这段代码放在哪里?在我的控制器中,我得到:The property or indexer 'System.Web.Mvc.ValueProviderResult.RawValue' cannot be used in this context because the set accessor is inaccessible
【解决方案4】:

您可以创建一个继承自ValidationAttribute 类的自定义验证类 以下链接清楚地说明了如何实现适合您问题的自定义验证类。

Custom Data Annotation

【讨论】:

  • 你有这个工作吗?它对我不起作用。我认为是因为这里解释的原因:forums.asp.net/p/1527149/3687407.aspx
  • 我刚刚对其进行了测试,它也有效,我在给定链接中测试了一个代码,它也有效。另请注意,论坛中解释的问题与 MVC 2 Preview 有关。
  • 奇怪,你用的是什么版本?所以,你看到字符串长度的验证信息出现了,但是文本框是空的?
  • 是的,我对它们都进行了测试,一个像你的情况一样的样本,另一个是论坛中解释的问题。
  • 很抱歉,我无法让它工作。你能发表你的看法吗?我也会添加我正在使用的视图。我正在使用 MVC 4。
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2021-08-08
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多