代码之家  ›  专栏  ›  技术社区  ›  goldenelf2

当提交的日期不正确时,传递的dataAnnotation属性中isvalid override中的ASP.NET MVC 2“value”为空。

  •  2
  • goldenelf2  · 技术社区  · 16 年前

    这是关于堆栈溢出的第一个问题。 我需要有关我在当前工作的ASP.NET MVC2项目中遇到的问题的帮助。 我应该注意到我对MVC设计比较陌生,所以请原谅我的无知。 这里是: 我有一个普通的表格,上面显示了关于一个人的各种细节。其中之一是“出生日期”。我的观点是这样的

    <div class="form-items">
                <%: Html.Label("DateOfBirth", "Date of Birth:") %>
                <%: Html.EditorFor(m => m.DateOfBirth) %>
                <%: Html.ValidationMessageFor(m => m.DateOfBirth) %>
    </div>
    

    我正在使用找到的编辑器模板,仅正确显示日期:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>"%>
    <%= Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty))%>
    

    我使用LinqToSQL设计器从SQL数据库创建我的模型。为了进行一些验证,我让一个部分类人员扩展由设计器创建的类(在同一命名空间下):

    [MetadataType(typeof(IPerson))]
    public partial class Person : IPerson
    {        //To create buddy class    }
    
    public interface IPerson
    {
        [Required(ErrorMessage="Please enter a name")]
        string Name { get; set; }
        [Required(ErrorMessage="Please enter a surname")]
        string Surname { get; set; }
        [Birthday]
        DateTime? DateOfBirth { get; set; }
        [Email(ErrorMessage="Please enter a valid email")]
        string Email { get; set; }
    }
    

    我要确保输入了正确的日期。所以我创建了一个自定义的dataAnnotation属性来验证日期:

    public class BirthdayAttribute : ValidationAttribute
    {
        private const string _errorMessage = "Please enter a valid date";
    
        public BirthdayAttribute() : base(_errorMessage) { }
    
        public override bool  IsValid(object value)
        {
            if (value == null)
            {
                return true;
            }
            DateTime temp;
            bool result = DateTime.TryParse(value.ToString(), out temp);
            return result;
        }
    }
    

    嗯,我的问题是这个。一旦我在“出生日期”字段中输入了错误的日期,即使使用了[生日(errormessage=“…………………”]等属性,也不会显示自定义消息。显示的消息是从数据库返回的消息,即“值'32/4/1967'对于出生日期无效。”。我尝试在代码周围输入一些断点,发现当日期不正确时,属性中的“value”总是空的,但如果日期格式正确,则总是得到一个值。在设计器生成的代码中也传递相同的(value==null)。

    这件事把我逼疯了。有人能帮我处理这个吗? 另外,如果有人能告诉我从视图进入数据库的确切位置。它与模型活页夹有关吗?因为我想在按下“提交”按钮后检查传递的值。 谢谢您。

    1 回复  |  直到 16 年前
        1
  •  1
  •   er-v    16 年前

    一般来说,所有验证资料都是在绑定值之后工作的。正如您所理解的,不可能从类似“asdvvvk”的字符串绑定日期时间值。因此,当绑定器遇到这样的错误时,它会将其添加到modelstate(查看modelstate[“dateofbirth”].errors[0].errormessage),并绑定默认值。日期时间的默认值?是空的,所以你总是用isvalid方法得到它。这是正常的。 所以你可以看到,如果你不想检查日期是否比其他日期大的话,日期的有效性是有意义的。如果输入字符串不正确,则没有进一步的验证。

    你能做什么?

    第一个简单的方法-你可以这样纠正你的行为

     [HttpPost]
            public ActionResult About(Person person, string dateOfBirth) {
                var birthdayAttribute = new BirthdayAttribute();
                if( !birthdayAttribute.IsValid(dateOfBirth)) {
                    ModelState["DateOfBirth"].Errors.Clear();
                    ModelState.AddModelError("DateOfBirth", birthdayAttribute.ErrorMessage);
                }
               .......
            }
    

    如您所见,有字符串出生日期,所以binder在绑定字符串值方面没有问题。但这不会让你的用户高兴。

    更好的方法-确保字符串的格式与客户机javascript正确。实际上,人们使用日期选择器控件来控制日期,感觉自己很好。

    另外,看看这里 http://forums.asp.net/t/1512140.aspx 尤其是布拉德·威尔逊的回答。