gpt4 book ai didi

asp.net-mvc-2 - ASP.NET mvc 2 - 用下拉菜单绑定(bind)出生日期

转载 作者:行者123 更新时间:2023-12-04 04:39:29 24 4
gpt4 key购买 nike

在 ASP.NET MVC 2 中,您将如何绑定(bind)作为 DateTime 的 View 模型属性,其中应用程序必须有 3 个下拉列表来选择月、日、年?我已阅读 Scott H. 的博客文章绑定(bind)日期前段时间,对于这样一个简单的案例来说,这似乎太复杂了。当然有更清洁/更好的方法吗?

无论我使用什么解决方案,我都想保留使用 DataAnnotations 的内置验证,并且我还希望能够使用验证属性指定最小/最大日期范围。

我的第一个想法是一个简单的自定义模型绑定(bind)器,如下所示:

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
var model = bindingContext.Model as RsvpViewModel;
var form = controllerContext.HttpContext.Request.Form;

if (model == null)
throw new ArgumentException("bindingContext.Model");

if (propertyDescriptor.Name.Equals("BirthDate"))
{
if (!string.IsNullOrEmpty(form["BirthYear"]) &&
!string.IsNullOrEmpty(form["BirthMonth"]) &&
!string.IsNullOrEmpty(form["BirthDay"]))
{
try
{
var yy = int.Parse(form["BirthYear"]);
var mm = int.Parse(form["BirthMonth"]);
var dd = int.Parse(form["BirthDay"]);
model.BirthDate = new DateTime(yy, mm, dd);
return;
}
catch (Exception)
{
model.BirthDate = DateTime.MinValue;
return;
}
}
}

base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}

然后我尝试创建一个 DateTimeAttribute 来进行验证,但是在属性声明中指定日期范围时遇到了一些困难,因为属性参数类型是有限的,而且 DateTime 不是允许的类型之一。

我最终创建了一个 IDateRangeProvider 接口(interface)和一个特定于出生日期的实现,如下所示:
public interface IDateRangeProvider
{
DateTime GetMin();
DateTime GetMax();
}

public class BirthDateRangeProvider : IDateRangeProvider
{
public DateTime GetMin()
{
return DateTime.Now.Date.AddYears(-100);
}

public DateTime GetMax()
{
return DateTime.Now.Date;
}
}

这使我可以在我的 View 模型上使用 DateTime 属性并保留所有构建良好...
[DisplayName("Date of Birth:")]
[Required(ErrorMessage = "Date of birth is required")]
[DateTime(ErrorMessage = "Date of birth is invalid", RangeProvider=typeof(BirthDateRangeProvider))]
public DateTime? BirthDate { get; set; }

但实际上,整个解决方案都有过度设计和过度思考的味道。没有更好的方法吗?

最佳答案

create seprate 3 Dropdownlist and addrequired validation attribute forthem.

and use BdateList,BMonthList topopulate your DropdownList

[DisplayName("Date of Birth ")]
public DateTime? Birthdate { get; set; }

[Required(ErrorMessage = "Date is required")]
public int BirthDateDate { get; set; }
[Required(ErrorMessage = "Month is required")]
public int BirthDateMonth { get; set; }
[Required(ErrorMessage = "Year is required")]
public int BirthDateYear { get; set; }


public List<System.Web.Mvc.SelectList> BDateList
{
get
{
// create List here

}
}

and in post method you could assignuser selected values values to Model BirthDate


BirthDate.Date.AddDays(BirthDateDate -1).AddMonths(BirthDateMonth)

关于asp.net-mvc-2 - ASP.NET mvc 2 - 用下拉菜单绑定(bind)出生日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com