C# 显示验证消息,但清除值

C# 显示验证消息,但清除值,c#,asp.net-mvc,validation,asp.net-mvc-4,data-annotations,C#,Asp.net Mvc,Validation,Asp.net Mvc 4,Data Annotations,我一直在四处寻找,但我找不到一个简单要求的答案: 使用MVC数据注释验证,您可以在验证摘要或字段旁边显示验证消息(“必须是最大长度为5的字符串”),但清除文本框的值(当验证失败时) 我尝试使用ModelState.Clear()和ModelState.Remove(“CompanyName”),但这会同时清除值和验证消息(验证状态) 我这样问是因为最近我们进行了渗透测试,其中一个建议是如果验证失败,不要预先填充安全值(信用卡号等)。这显然是一个小问题,但建议不要在没有必要的情况下通过intern

我一直在四处寻找,但我找不到一个简单要求的答案:

使用MVC数据注释验证,您可以在验证摘要或字段旁边显示验证消息(“必须是最大长度为5的字符串”),但清除文本框的值(当验证失败时)

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

我这样问是因为最近我们进行了渗透测试,其中一个建议是如果验证失败,不要预先填充安全值(信用卡号等)。这显然是一个小问题,但建议不要在没有必要的情况下通过internet(从服务器)将值发送回

以下是我正在使用的代码:

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> 
}
@model Test.Models.CompanyInput
编辑
@使用(Html.BeginForm(“编辑”、“公司”))
{
@Html.EditorForModel()
提交
}

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

[Required(ErrorMessage = "must be a string with a maximum length of 5")]
OP澄清后更新:


清除输入字段=字符串。空

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


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


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

每个字段的ModelState包含的不仅仅是值,因此,从集合中删除它会像预期的那样彻底删除错误消息。我相信你应该能够通过这样做来清除价值

ModelState["CompanyName"].Value = null;
EDIT:仔细检查后,我发现Value属性的类型为
ValueProviderResult
,简单地将其置零并不会得到所需的结果,而且因为此类的属性似乎只是getter,所以您必须用自己的实例替换该实例。我已经测试了以下内容,它对我很有效

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

我想你不明白我的问题,对不起,如果我不清楚的话。即使我更改了错误消息,我输入的值(验证失败)也将预先填充到文本框中。我想显示验证消息,但清除文本框中的值(当验证失败时)。我应该将此代码放在哪里?在我的控制器中,我得到:
属性或索引器'System.Web.Mvc.ValueProviderResult.RawValue'不能在此上下文中使用,因为集合访问器不可访问
您得到它了吗?这对我不起作用。我想这是因为这里解释的原因:我刚刚测试了它,它也工作了,我测试了给定链接中的代码,它也工作了。还要注意,论坛中解释的问题是关于MVC2预览的。奇怪,你们使用的是什么版本?所以,你看到字符串长度的验证消息出现了,但文本框是空的?是的,我测试了两个,一个像你的情况一样的示例和另一个在论坛上解释的问题。很抱歉,我只是无法让它工作。你能发表你的观点吗?我还将添加正在使用的视图。我用的是MVC4。是的,我想这就是问题所在。那么,自定义验证器会重置
RawValue
属性吗?这看起来怎么样?另外,jquery调用(据我所知)仍然会从服务器返回输入值。我只是尝试了一下。这仍然会显示验证失败时输入的尝试值。因为我使用的是
@Html.EditorForModel
,所以我想我遇到了这里描述的问题:。然而,我想知道是否有明显的东西我遗漏了。啊,对不起,我的错。我没有仔细查看Value属性的数据类型。这是一个
ValueProviderResult
。但是,此上的属性似乎只是getter。因此,您必须将其替换为一个新实例,以获得所需的行为。检查我的更新答案。实际上,看到“预填充”值非常奇怪,因为如果模型无效,则返回空(new companyput())模型作为查看结果。你确定你发布的代码样本正确吗?@alexanerb是的,我的想法完全正确。是的,代码示例是正确的。我也觉得很奇怪。看看HTML,输入值初始化了吗???可能是浏览器也在缓存输入字段。@alexanderb很好,我将运行一个代理并检查它。但是,我注意到,如果执行
@Html.PasswordFor(m=>m.CompanyName)
操作,该值将被清除。