【问题标题】:Validation on int data type asp .net mvc3验证 int 数据类型 asp .net mvc3
【发布时间】:2012-03-30 05:37:56
【问题描述】:

我收到The value 'abc' is not valid for fieldName. 作为错误消息。这是默认错误消息,我想以更简单的方式覆盖它。
截至目前,我尝试过的内容列在下面

  • [RegularExpression(@"^\d+$",ErrorMessage="enter numeric value")]
  • [Integer(ErrorMessageResourceType = typeof(appName.Resources.abc.Resource), ErrorMessageResourceName = "error_numeric")]
  • [RegularExpression("([1-9][0-9]*)")]
  • Range(1,int.max,ErrorMessage="enter numeric value")
    但未能更改默认错误消息。
    建议我最简单的方法来做到这一点。

       using System;
       using System.Collections.Generic;
       using System.Linq;
       using System.Web;
       using System.ComponentModel.DataAnnotations; 
       using System.Web.Mvc;
    
      namespace blueddPES.ViewModels
         {
         public class ContactViewModel
            {
             [Integer(ErrorMessage="sdfdsf")]
             public int? hp { get; set; }
            }
    

【问题讨论】:

  • 不要寻找数据注释来覆盖此验证场景。您将无法使用整数等值类型来实现这一点,正如我在您的上一个问题中已经回答的那样:stackoverflow.com/questions/9921067/…。您需要自定义模型绑定器,因为它是将请求值解析为整数的默认模型绑定器,如果失败,它会添加默认错误消息,该消息在 System.Web.Mvc 程序集中硬编码为资源。
  • 但是@DarinDimitrov 我不想为这个小东西添加那么多自定义代码。除了添加自定义模型绑定器,我还有另一个选项可以将字符串作为数据类型而不是 int。
  • 是的,你确实有这个选项。

标签: asp.net asp.net-mvc-3 data-annotations


【解决方案1】:

最简单的方法是使用Data Annotations Extensions。它有一些有用的属性,比如整数等。

或者你也可以自己写,比如:How to change 'data-val-number' message validation in MVC while it generate by helper

编辑:在 cmets 之后添加了完整的示例。

我创建了一个示例 vanilla MVC 3 项目,然后执行以下操作:

  1. 添加了 NuGet 包DataAnnotationsExtensions.MVC3

  2. 添加了一个模型类:

    public class IntegerSample
    {
        [Required(ErrorMessage="Dude, please fill something in!")]
        [Integer(ErrorMessage="Are you stupid? Just fill in numbers only!")]
        public int? TestValue { get; set; }
    }
    
  3. 添加了一个家庭控制器:

    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            return View();
        }
    }
    
  4. 添加了主视图:

    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>IntegerSample</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.TestValue)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.TestValue)
                @Html.ValidationMessageFor(model => model.TestValue)
            </div>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }
    

希望您使用此示例代码获得更多见解。当我运行这个示例时,它的工作方式与您期望的一样。

【讨论】:

  • 您是否首先为 DataAnnotations 包安装了 nuget 包?见:nuget.org/packages/DataAnnotationsExtensions.MVC3
  • 那什么不起作用?您收到错误消息还是?请发布更多代码...
  • 我在每种情况下都收到默认错误消息,即“值 'abc' 对 fieldName 无效”。
  • 我明白了,请发布更多代码,f.i.您的模型具有我们正在讨论的属性..
  • 我试过这个,但它对我不起作用。显示默认错误消息
【解决方案2】:

您可以将自定义模型绑定器实现为shown here 或使用字符串数据类型而不是整数,然后应用正则表达式数据注释。当然,如果您使用字符串数据类型,则在将视图模型映射到域模型时,您可能需要手动将此字符串解析为底层数据类型。

【讨论】:

  • 完成了字符串部分并且工作正常。但我仍然需要更好的方法(除了 ModelBinder)。如果你有什么问题,请告诉我。
  • 不,我没有其他方法。我个人使用自定义模型绑定器来处理这种情况。
【解决方案3】:

我们使用 Phil Haack MetadataProvider 的扩展版本,可以进行本地化。

看看这篇博文:http://haacked.com/archive/2011/07/14/model-metadata-and-validation-localization-using-conventions.aspx

总结:

  • 它通过使用类类型+属性来确定资源键,例如Person_FirstName
  • 它通过为验证属性添加后缀来查找错误消息,例如Person_FirstName_Required
  • 您只需提供包含这些条目的资源文件。

【讨论】:

  • 你提供的链接是否相关?
  • 我想是的,如果您想更改数据注释使用的默认消息,您可以通过使用提供程序将它们放入资源文件中来实现(无论如何这是本地化字符串的最佳实践)在那篇文章中可用。
  • 目前我正在使用资源文件从中获取所有内容。通过说所有我的意思是显示名称,错误消息(显示在视图上),我也明白了,但问题只是 int 数据类型错误消息。
猜你喜欢
  • 2012-02-02
  • 2011-01-08
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多