【发布时间】:2011-11-17 10:47:03
【问题描述】:
我遇到了一种情况,我正在上传用户从其本地文件系统中选择的图像。在我看来,我的表单基本上有两个提交按钮。一个用于正常提交表单,并执行所有验证。第二个仅用于上传图像,在这种情况下我还不想验证。
我设法通过给我的“上传图片”提交按钮一个“样式名称取消”的类值来关闭客户端验证,所以
<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" />
现在,当我回帖时,我的模型有一个属性 UploadImageButton,当单击此按钮时,它会填充此属性(输入的名称与属性匹配)。这样,我就知道表单是由我真正的提交按钮还是由 UploadImageButton 提交的。
我的问题是…… 如何关闭服务器端验证?我不希望在用户单击此按钮时显示验证摘要信息。我知道你可以使用这个添加自定义模型错误
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
}
【问题讨论】:
-
你为什么要做
Where(key => ModelState.Keys.Contains(key))?似乎 Where 子句是多余的,因为 ModelState.Keys 中的每个键都会有其 ModelState.Keys.Contains(key) 返回 true。 -
我已经更新了问题和文本,以便在 ModelState.ContainsKey 上使用更短的方法,尽管您的假设是错误的。它们在做同样的事情。
-
对不起,我可能解释得不好或误解了您的回复。
ModelState.ContainsKey(key)和ModelState.Contains(key)做同样的事情是对的,但我的观点是ModelState.Keys.ToList()中的所有值本质上都会包含在ModelState中,因此整个Where子句是多余的,并且将减慢性能。不过是小事。 -
那是 ReSharper 把它放在一起的。感谢您指出这一点。
-
请注意您找出哪个按钮是提交源的方式。在 ViewModel 中,您不必拥有此属性。只需在Controller中添加一个FormCollection参数:public ActionResult Index(YourViewModelClass model, FormCollection formCollection)。并检查按钮名称是否在其中:if (formCollection["UploadImageButton"] != null)。我认为最好有更多提交按钮。
标签: asp.net-mvc-3 validation modelstate