显示验证消息,但清除值

时间:2012-07-11 22:46:02

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

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

使用MVC数据注释验证,您是否可以在验证摘要中或字段旁边显示验证消息('必须是最大长度为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> 
}

4 个答案:

答案 0 :(得分:2)

由于ModelState无效,您将需要创建自定义验证程序或jQuery ajax / json调用以确定是否需要清除数据。

只是将模型属性更改为string.Empty或类似的东西将无法解决问题,因为整个视图使用之前成功发布的模型重新呈现,但模型验证错误。

答案 1 :(得分:2)

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

ModelState["CompanyName"].Value = null;

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

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

答案 2 :(得分:1)

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

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

OP明确后更新:

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

答案 3 :(得分:1)

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

Custom Data Annotation