我遇到的情况是我正在上传用户从本地文件系统中选择的图像。在我看来,我的表单基本上有两个提交按钮。一个用于正常提交表单,并执行所有验证。第二个仅用于上传图像,在这种情况下我还不想验证。
我设法通过向“上传图片”提交按钮提供“样式名称取消”的类值来关闭客户端验证,所以
<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" />
现在,当我回发时,我的模型有一个属性UploadImageButton,当单击此按钮时,它会填充此属性(输入的名称与属性匹配)。这样,我知道表单是由我的真实提交按钮还是由UploadImageButton提交。
我的问题是...... 如何关闭ServerSide验证?我不希望在用户单击此按钮时显示验证摘要信息。我知道您可以使用此
添加自定义模型错误ModelState.AddModelError("{key}", "{error msg}");
我正在寻找一种删除模型错误的方法。这可能吗?
编辑:
以下是我提出的建议:
foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
//ModelState.Remove(key); //This was my solution before
ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}
答案 0 :(得分:131)
您可以通过执行以下操作来删除模型错误:
if (ModelState.ContainsKey("{key}"))
ModelState["{key}"].Errors.Clear();
答案 1 :(得分:60)
这构建了以前的答案,但稍微简化了一点:
foreach (var modelValue in ModelState.Values)
{
modelValue.Errors.Clear();
}
答案 2 :(得分:6)
通常,您不希望关闭服务器端验证或手动删除ModelState错误。它是可行的,但容易出错,因为它必须依赖字符串作为键。我赞成如何删除密钥的答案,因为它是正确和有用的,但我建议不要将自己设计成一个你必须强烈考虑它的情况。
在您的情况下,您有相同表单的多个提交按钮,但在上传图像时您确实没有提交表单。为了防止客户端验证,您可以使用已经指示的“取消”类,但我还建议以不同的形式使用第二个提交按钮,在这种情况下,它不会导致您的主表单上的验证。 / p>
使用不同的表单还有第二个好处:您可以将其发送到另一个ActionResult方法,该方法只处理上传图像的逻辑。这种不同的方法根本不需要检查模型状态的“IsValid”属性:它只关心图像中是否有信息,并且可以单独检查。 (即使您使用相同的ActionResult方法,也可以将逻辑漏斗,以便您不依赖于模型状态的IsValid属性。)
如果你必须清除模型状态中的错误,清除所有错误是有意义的,试试这个:
foreach (var key in ModelState.Keys)
{
ModelState[key].Errors.Clear();
}
这使您无法获得正确的密钥名称,但如果模型中已存在任何值(有效或无效),则会保留这些值。
在这些情况下要检查的最后一件事是,您是否有时只在视图中有值,这不会导致客户端验证(它们不在视图中),但会导致服务器端验证问题。在这种情况下,最好使用@ Html.HiddenFor(model =&gt; model.PropertyName,如果可以,假设已经设置了该值,则在该视图中不可见。
答案 3 :(得分:6)
我有时使用它,所以我已经用它做了一个扩展方法:
public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName)
{
if (m.ContainsKey(fieldName))
m[fieldName].Errors.Clear();
return m;
}
可以流畅地使用它来清除多个字段的错误。
答案 4 :(得分:0)
使用ModelState.Remove(“ {key}”)从model中删除错误,这会将ModelState.IsValid重置为true
ModelState.Remove("{key}");