1

由于 MVC3 为 DateTime 提供的默认编辑器对 HTML5 不友好,因此我编写了以下自定义编辑器模板:

(日期时间.cshtml)

@model DateTime?

<input type="date" value="@{ 
    if (Model.HasValue) {
        @Model.Value.ToISOFormat() // my own extension method that will output a string in YYYY-MM-dd format
    }
}" />

现在,这工作正常,但后来我遇到了日期没有正确解析的问题,因为 ISO 日期没有使用默认的 DateTime 绑定进行解析。所以,我实现了自己的活页夹:

public class IsoDateModelBinder: DefaultModelBinder
{
    const string ISO_DATE_FORMAT = "YYYY-MM-dd";

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (string.IsNullOrEmpty(value.AttemptedValue))
            return null;

        DateTime date;
        if (DateTime.TryParseExact(value.AttemptedValue, ISO_DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out date));
            return date;

        return base.BindModel(controllerContext, bindingContext);
    }
}

我已经注册了它(Global.asax.cs):

System.Web.Mvc.ModelBinders.Binders.Add(typeof(DateTime), new IsoDateModelBinder());
System.Web.Mvc.ModelBinders.Binders.Add(typeof(DateTime?), new IsoDateModelBinder());

但是,当自定义编辑模板就位时,自定义活页夹根本不会被调用。我已将其从解决方案中删除,并且正确调用了自定义活页夹——尽管此时格式错误,因为自定义编辑器没有提供正确的控件。

那么,我错过了什么?

4

1 回答 1

0

事实证明我得到了它的工作。我怀疑这两种能力之间存在干扰,但实际上并非如此。

问题出在编辑器模板中,它不完整。对于发送回值的表单,它们需要有一个值(当然)和一个名称。如果名称不存在,则不会将值发送回服务器,当然也不会调用活页夹,因为没有要绑定的值。

正确的模板应该看起来更像这样:

@model DateTime?

<input type="date" id="@Html.IdFor(model => model)" name="@Html.NameFor(model => model)" value="@{ 
    if (Model.HasValue) {
        @Model.Value.ToISOFormat()
    }
}" />

此外,我这边的 ISO 格式字符串是错误的,它应该是yyyy-MM-dd而不是YYYY-MM-dd.

于 2012-11-07T19:02:13.097 回答