【问题标题】:How to disable field validation on MVC view?如何禁用 MVC 视图上的字段验证?
【发布时间】:2011-11-18 12:16:04
【问题描述】:

我有一个 MVC 3 应用程序。 我有一个名为 UserModel 的模型,其中包含一个电子邮件字段,已通过 RemoteAttribute 验证其唯一性。我想在 2 个视图上使用 UserModel - EditUser 和 CreateUser。如何允许在 EditUser 视图上验证电子邮件字段(因为该字段是只读的),并将其保留在 CreateUser 视图上?

【问题讨论】:

  • 您的意思是:- 仅在 CreateUser 视图上验证电子邮件,因为它在 EditUser 视图上是只读的?
  • 是的,这正是我的意思。现在,我决定有 2 个不同的模型,出于这个原因从基础继承

标签: .net asp.net-mvc validation


【解决方案1】:

您可以使用部分验证技术来修改验证结果。此示例将丢弃电子邮件字段的任何错误。

public class DontValidateEmailAttribute : ActionFilterAttribute {

  public override void OnActionExecuting(ActionExecutingContext filterContext) {
    var modelState = filterContext.Controller.ViewData.ModelState; 
    var incomingValues = filterContext.Controller.ValueProvider;

    var key = modelState.Keys.Single(x => incomingValues.Equals("Email"));    
    modelState[key].Errors.Clear();

  }
}

并将此属性应用于您的编辑控制器。

我从Steve Sanderson's Pro ASP NET MVC 3 学到了这项技术。他使用该技术验证具有必填字段但数据输入是多步骤向导的模型。如果该值尚未在表单发布中返回,他会删除该属性的错误。

【讨论】:

  • hm.... 这听起来有点奇怪,但我使用相同的控制器进行创建和编辑操作。也许这就是进行一些重构的原因
  • 一个快速的解决方法是在编辑视图上为电子邮件创建一个隐藏字段,这样它就会在帖子中返回并且存在并且有效。
  • Heh))) 不错的 hack,可能会奏效。经过一段时间寻找更好的解决方案后,我将使用它。谢谢
【解决方案2】:

解决此问题的一个好方法是将 usermodel id 作为附加字段传递给远程验证方法。这在创建时将为空白或 null,但在编辑时填充。然后,您可以向远程验证方法添加逻辑以检查 id。
请参阅下面的示例

[Remote("ValidationMethod", "UserModel", AdditionalFields = "Id", ErrorMessage = "Error message")] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多