4

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

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

我尝试使用ModelState.Clear()and 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

4 回答 4

2

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

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

于 2012-07-11T23:26:54.170 回答
2

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

ModelState["CompanyName"].Value = null;

EDIT: Upon closer inspection I found that the Value property is of type ValueProviderResult, simply nulling it doesn't give the desired result, and because the properties of this class appear to be getters only you have to replace the instance with your own. I've tested the following and it works for me.

ModelState["CompanyName"].Value = new ValueProviderResult(string.Empty, string.Empty, ModelState["CompanyName"].Value.Culture);
于 2012-07-11T23:54:19.227 回答
1

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

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

OP明确后更新:

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

于 2012-07-11T22:54:16.010 回答
1

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

自定义数据注释

于 2012-07-11T23:03:58.757 回答