MVC3删除ModelState错误

我有一个情况,我正在上传用户从他的本地文件系统中select的图像。 我的表格在我看来,基本上有两个提交button。 一个用于正常提交表单,并执行所有的validation。 第二只是上传图像,在这种情况下,我不想validation。

我设法closures客户端validation,通过给我的“上传图像”提交button一个类的值“样式名称取消”,所以

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

现在,当我回发时,我的模型有一个属性UploadImageButton,单击此button时,它将填充此属性(input的名称与Property相匹配)。 这样,我知道表单是由我的真正的提交button还是由UploadImageButton提交。

我的问题是这个…如何closuresServerSidevalidation? 我不希望用户单击此button时显示validation摘要信息。 我知道你可以使用这个添加自定义模型错误

 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 } 

你可以通过做这样的事情来删除模型错误:

 if (ModelState.ContainsKey("{key}")) ModelState["{key}"].Errors.Clear(); 

这构build了以前的答案,但简化了一点:

 foreach (var modelValue in ModelState.Values) { modelValue.Errors.Clear(); } 

一般来说,您不想closures服务器端validation或手动删除ModelState错误。 这是可行的,但容易出错,因为它必须依赖string作为关键字。 我提出了关于如何删除密钥的答案,因为它是正确和有用的,但我build议不要把自己devise成一个你必须强有力地考虑的情况。

在你的情况下,你有同一个表单的多个提交button,但是当你上传图片时,你确实没有提交表单。 为了防止客户端validation,您可以使用已经指出的“取消”类,但我也build议让第二个提交button以不同的forms,在这种情况下,它不会导致主窗体上的validation。

使用不同的表单还有第二个好处:你可以把它发送到不同的ActionResult方法,它只处理上传图像的逻辑。 这种不同的方法将不会检查模型状态的“IsValid”属性:它只关心图像中是否有信息,并且可以单独检查。 (即使您使用相同的ActionResult方法,也可以使用逻辑,以便不依赖模型状态的IsValid属性。)

如果您必须清除模型状态中的错误,并且清除所有错误是有意义的,请尝试以下操作:

 foreach (var key in ModelState.Keys) { ModelState[key].Errors.Clear(); } 

这样可以防止取得正确的键名,但是如果模型中已经存在任何值(有效或无效),则保留这些值。

在这些情况下最后要检查的是,您是否只有在视图中有值的情况,这些值不会导致客户端validation(它们不在视图中),但会导致服务器端validation问题。 在这种情况下,最好使用@ Html.HiddenFor(model => model.PropertyName,如果可以的话,假设已经设置了该值,则在该视图中不可见。

我有时使用它,所以我已经做了一个扩展的方法:

 public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName) { if (m.ContainsKey(fieldName)) m[fieldName].Errors.Clear(); return m; } 

它可以stream利地使用来清除多个字段的错误。