DateTime属性的必需属性

时间:2011-06-06 14:09:57

标签: c# asp.net-mvc-3

我已经编写了以下代码,用于指定日期作为必填字段。但是当删除默认日期并尝试提交时,不会显示任何错误消息。

[DisplayName("Appointed Date")]
[Required(ErrorMessage = "Appointed Date Is Required")]
public virtual DateTime AppointedDate { get; set; }

如果我需要做更多的事情,请告诉我。

1 个答案:

答案 0 :(得分:3)

通常这与解析时模型绑定器中的非可空类型失败有关。使模型中的日期可以为空,看看是否能解决您的问题。否则,编写自己的模型绑定器并更好地处理它。

编辑:按模型我的意思是视图的视图模型,进行推荐的更改,如果你想坚持在视图中绑定到你的模型(我假设是使用EF),请按照写你的自己的模型活页夹建议

编辑2:我们做了类似这样的事情来获得一个自定义格式来解析可空的日期时间(这可能是你调整非可空类型的好开始):


public sealed class DateTimeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

        if (valueProviderResult == null)
        {
            return null;
        }

        var attemptedValue = valueProviderResult.AttemptedValue;

        return ParseDateTimeInfo(bindingContext, attemptedValue);
    }

    private static DateTime? ParseDateTimeInfo(ModelBindingContext bindingContext, string attemptedValue)
    {
        if (string.IsNullOrEmpty(attemptedValue))
        {
            return null;
        }

        if (!Regex.IsMatch(attemptedValue, @"^\d{2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{4}$", RegexOptions.IgnoreCase))
        {
            var displayName = bindingContext.ModelMetadata.DisplayName;
            var errorMessage = string.Format("{0} must be in the format DD-MMM-YYYY", displayName);
            bindingContext.ModelState.AddModelError(bindingContext.ModelMetadata.PropertyName, errorMessage);
            return null;
        }

        return DateTime.Parse(attemptedValue);
    }
}

然后注册(通过在Dependency Injection容器中提供此类):


public class EventOrganizerProviders : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType == typeof(DateTime))
        {
            return new DateTimeBinder();
        }

                // Other types follow
        if (modelType == typeof(TimeSpan?))
        {
            return new TimeSpanBinder();
        }

        return null;
    }
}