设置组合 3 个下拉列表 MVC 的属性

本文关键字:MVC 属性 下拉列表 组合 设置 | 更新日期: 2023-09-27 18:35:11

我正在尝试使用 MVC 中的月、日和年 3 个下拉列表为出生日期设置日期时间属性Birthday。 此时我无法获得有效的模型状态。 此外,"模型。生日。[月、日或年]"的值无法从标记中识别出来。 请帮忙。

我的标记如下:

@model StatisticalTracker.Models.RegisterModel
...
<li>
      @Html.LabelFor(m => m.Birthday)
      @Html.DropDownListFor(m => m.Birthday.Month, SelectListItemHelper.GetMonths(), "-- Month --", new { style = "display: inline-block" }) /
      @Html.DropDownListFor(m => m.Birthday.Day, SelectListItemHelper.GetDays(), "-- Day --", new { style = "display: inline-block" }) /
      @Html.DropDownListFor(m => m.Birthday.Year, SelectListItemHelper.GetYears(), "-- Year --", new { style = "display: inline-block" })
</li>

我的视图模型如下:

public class RegisterModel
{
   ...    
   [DataType(DataType.Date)]
   [Display(Name = "Birthday")]
   public DateTime Birthday { get; set; }
}

我的主修如下:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
     if (model.Birthday.Month == 0 || model.Birthday.Day == 0 && model.Birthday.Year == 0)
     {
         ModelState.AddModelError("Birthday", "Date of birth is required");
     }
     else
     {
         DateTime dt = new DateTime(model.Birthday.Year, model.Birthday.Month, model.Birthday.Day);
         model.Birthday = dt;
     }
     if (ModelState.IsValid)
     {
         ...
     }
     // If we got this far, something failed, redisplay form
     return View(model);
 }

设置组合 3 个下拉列表 MVC 的属性

您可以为模型中具有公共资源库的属性创建 HTML 帮助程序,而不是为从模型中的属性派生的内容创建 HTML 帮助程序。正如 Ric 所指出的 - 日期时间.年份/.月/。Day 属性是只读的,因此无法绑定。

你应该做的是创建一个新的视图模型,如下所示:

public class RegisterModel
{
   ...    
   [Display(Name = "Birthday Year")]
   public int BirthdayYear { get; set; }
   [Display(Name = "Birthday Month")]
   public int BirthdayMonth { get; set; }
   [Display(Name = "Birthday Day")]
   public int BirthdayDay { get; set; }
}

如果你想实现验证以确保日期有效(即确保他们不能在非闰年中选择 2 月 29 日等),你需要一个自定义验证属性 - 这篇文章看起来不错:http://dotnetspeak.com/2012/05/validating-dependent-fields-in-asp-net-mvc

如果您只需要服务器端验证,一种更简单的方法是在模型类中实现IValidateableObject - 例如:http://weblogs.asp.net/scottgu/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3

作为另一种方法 - 你可以只有一个日期字段 - 但添加一个客户端日期选择器 - jQuery UI 非常好。(HTML5 <input type="Date">是另一种方法,但你不能保证所有客户端都支持它)

最后一个选项是对 Birthday Date 属性使用<input type="hidden">,并将一些客户端 javascript 绑定到下拉列表,以便在更改每个下拉列表时更新隐藏字段。