gpt4 book ai didi

c# - 设置结合 3 个下拉菜单 MVC 的属性

转载 作者:行者123 更新时间:2023-11-30 16:56:42 26 4
gpt4 key购买 nike

我正在尝试使用 MVC 中月、日和年的 3 个下拉菜单为出生日期设置 DateTime 属性 Birthday。此时我无法获得有效的 ModelState。此外,“model.Birthday.[Month, Day, or Year]”值无法从标记中识别出来。请帮忙。

我的标记如下:

@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>

我的ViewModel如下:

public class RegisterModel
{
...

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

我的 Controller 如下:

[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);
}

最佳答案

您可以为模型中具有公共(public) setter 的属性创建 HTML 帮助程序 - 而不是为从模型中的属性派生的东西。正如 Ric 所说 - DateTime.Year/.Month/.Day 属性是只读的,因此不能绑定(bind)。

您应该做的是创建一个新的 View 模型,例如:

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"> 是另一种方法,但不能保证所有客户端都支持)

最后一个选项是为生日日期属性使用 <input type="hidden">,并将一些客户端 javascript 绑定(bind)到下拉列表,当每个下拉列表更改时更新隐藏字段。

关于c# - 设置结合 3 个下拉菜单 MVC 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624364/

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