【问题标题】:turn off data-val-* attribute on primitive types关闭原始类型的 data-val-* 属性
【发布时间】:2013-04-30 16:48:41
【问题描述】:

有没有人知道如何关闭 MVC3 使用 data-val-* 属性自动装饰原始类型。

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

删除了 data-val-required 属性,但我似乎找不到关闭原始类型的方法,例如:data-val-number

我有很多不需要在表单上验证的隐藏 int 字段,但是由于这些属性,它们正在被验证,导致我的应用程序出现冻结。

【问题讨论】:

标签: asp.net-mvc-3


【解决方案1】:

我想隐藏的 int 字段在视图模型中定义了 [Required] 数据注释?如果是这样,那么我相信您只需删除数据注释即可防止显示data-val-required 属性。

我可能是错的,但我怀疑你会说当该视图模型用于其他视图时该字段是必需的?

如果是这种情况,那么您需要正确定义视图模型,而不是关闭数据注释(本质上是一种变通方法)。理想情况下,每个视图模型都应该特定于它所定义的视图(参见以下link模式 3)。这将避免出现某些视图需要字段而其他视图不需要字段的问题。

【讨论】:

  • 视图模型中的 int 字段没有用任何数据注释修饰,我遇到的问题是验证正在减慢我的应用程序在不需要验证的隐藏字段上的速度。 MVC 正在用 data-val-number 修饰这些 int 字段,使它们在提交时被验证。
  • 我明白你现在的意思了。我之前使用过字符串类型,但实际上,如果您使用没有数据注释的 int 数据类型,您确实会获得 data-val-required 和 data-val-number 属性。但是,我仍然不确定为什么这是一个问题。如果您指定了一个隐藏的 int 字段,那么在该字段中应该有一个提供的 int 值,在这种情况下,无论如何验证都应该通过(我不确定它是否会降低应用程序的速度,因为这是客户端验证)。
  • 如果该隐藏字段没有值,您是否可以不在视图中呈现该字段?这样,当您执行发布操作时,将没有要发布的值,并且活页夹只会使用默认值?有一个类似的问题here,Phil Haacks 的答案是我自己感兴趣的答案。
  • 它是一个非常复杂的模型,有很多项目列表,这些隐藏字段主要是列表的 id,这些需要有值但值在服务器端检查,客户端验证正在检查它们包含我不需要它做的数字,创建我自己的 html 助手解决了这个问题。感谢您的帮助。
【解决方案2】:

我似乎找不到关闭此功能的方法,因此创建了自己的 HtmlHelper 来解决此问题。

public static IHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        var memberExpression = (MemberExpression)expression.Body;
        string fullID = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(memberExpression.Member.Name);
        var builder = new TagBuilder("input");
        builder.MergeAttribute("type", "hidden");
        var value = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
        builder.MergeAttribute("value", value.ToString());
        string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
        builder.MergeAttribute("name", fullName);
        builder.GenerateId(fullID);
        var tag = builder.ToString(TagRenderMode.SelfClosing);
        return new HtmlString(tag);
    }

【讨论】:

    【解决方案3】:

    我注意到,如果您从 ajax 请求加载部分视图,则不会自动添加部分视图内的验证 (data-val-*)。所以我终于改变了我的代码,从 ajax 加载不需要验证的 heavy 表单数据。

    【讨论】:

      【解决方案4】:

      您可以在页面上创建的 HTML 输入中指定data-val="false",例如:

      <input type="checkbox" name="foo" value="@item.foo" class="input-validation-error"
       data-val="false">
      

      【讨论】:

      • 谢谢,我想使用 html 助手创建 html 输入,而 HiddenFor 助手正在添加原始类型注释。我创建了自己的 html 助手来解决这个问题,并将代码发布在单独的答案中。
      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多