1

MVC3がDateTimeに提供するデフォルトのエディターはHTML5に対応していないため、次のカスタムエディターテンプレートをコーディングしました。

(DateTime.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-ddYYYY-MM-dd

于 2012-11-07T19:02:13.097 に答える