1

这是否可能在模型中有一个 DateTime 属性,但将其用作视图/表单的两个输入?例如,日期部分将使用 jqueryui datepicker,而时间部分选择器将是一个掩码输入,或其他漂亮的 jquery 插件。有时我需要使用两个下拉菜单进行时间选择(小时和分钟)。

我的目标是在模型中有一个 DateTime 属性(日期和时间没有部分字符串)。这可能吗?使用 MVC4。

4

3 回答 3

3

Here's a technique i use to split a date into 3 fields, while only having 1 DateTime property on the ViewModel. While not exactly what you're after, you should be able to use a similar method to achieve what you want.

Editor Template /views/shares/editortempaltes/datetime.cshtml

@model Nullable<System.DateTime>         
@Html.TextBox("Day", Model.HasValue ? Model.Value.Day.ToString() : "", new { Type = "Number", @class="date-day" })
@Html.ValidationMessage("Day")
@Html.DropDownList("Month", months, new { @class="date-month" })
@Html.ValidationMessage("Month")
@Html.TextBox("Year", Model.HasValue ? Model.Value.Year.ToString() : "", new { Type = "Number", @class="date-year" })
@Html.ValidationMessage("Year")

Custom ModelBinder

public object GetValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
    int day, month, year;

    if (TryGetValue(controllerContext, bindingContext, propertyDescriptor.Name + ".Day", out day) && TryGetValue(controllerContext, bindingContext, propertyDescriptor.Name + ".Month", out month) && TryGetValue(controllerContext, bindingContext, propertyDescriptor.Name + ".Year", out year))
    {
        try
        {
            return new DateTime(year, month, day);
        }
        catch (ArgumentOutOfRangeException)
        {
            var fullPropertyName = bindingContext.ModelName + "." + propertyDescriptor.Name;               
            bindingContext.ModelState[fullPropertyName] = new ModelState();                         
            bindingContext.ModelState[fullPropertyName].Errors.Add("Invalid date");
        }
    }
    return null;
}


private bool TryGetValue(ControllerContext controllerContext, ModelBindingContext bindingContext, string propertyName, out int value)
{
    var fullPropertyName = bindingContext.ModelName + "." + propertyName;
    string stringValue = controllerContext.HttpContext.Request[fullPropertyName];
bindingContext.ModelState.Add(fullPropertyName, new ModelState() { Value = new ValueProviderResult(stringValue, stringValue, null) });
    return int.TryParse(stringValue, out value);
}

Usage Add a DateTime property to your ViewModel, then call

@Html.EditorFor(m => m.DateTimeProperty)
于 2012-10-26T07:40:30.703 回答
2

作为建议的解决方案的替代方案,您可以使用映射到 DateTime 属性的隐藏字段,并在表单上的某些控件更改日期的一部分时使用 Javascript 在客户端相应地对其进行修改。

于 2012-10-26T07:25:35.600 回答
0

是的你可以。如果您尝试将值传递给字段,只需将模型传递给视图并使用 DateTime 即可。

要取回数据,您可以返回 2 DateTime(一个代表秒,一个代表时间)并在控制器中组合 2 个日期。

如果您需要更具体的帮助,请向我们展示您在代码中遇到的问题,以便我们可以帮助您实施

于 2012-10-25T20:50:59.220 回答