我一直在四处寻找,但我无法找到一个简单要求的答案:
使用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>
}
答案 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
类的自定义验证类
以下链接清楚地说明了如何实现适合您的问题的自定义验证类。