6

私は ASP .NET MVC 4 RC 内で Web API を使用しており、null 可能な DateTime プロパティを持つ複雑なオブジェクトを受け取るメソッドがあります。入力の値をクエリ文字列から読み取る必要があるため、次のようなものがあります。

public class MyCriteria
{
    public int? ID { get; set; }
    public DateTime? Date { get; set; }
}

[HttpGet]
public IEnumerable<MyResult> Search([FromUri]MyCriteria criteria)
{
    // Do stuff here.
}

これは、2012 年 1 月 15 日のようなクエリ文字列で標準の日付形式を渡すとうまく機能します。

http://mysite/Search?ID=1&Date=01/15/2012

ただし、DateTime のカスタム形式 (おそらく MMddyyyy) を指定したい... 例:

http://mysite/Search?ID=1&Date=01152012

編集:

カスタム モデル バインダーを適用しようとしましたが、DateTime オブジェクトだけに適用できませんでした。私が試した ModelBinderProvider は次のようになります。

public class DateTimeModelBinderProvider : ModelBinderProvider
{
    public override IModelBinder GetBinder(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof(DateTime) || bindingContext.ModelType == typeof(DateTime?))
        {
            return new DateTimeModelBinder();
        }
        return null;
    }
}

// In the Global.asax
GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new DateTimeModelBinderProvider());

新しいモデル バインダー プロバイダーが作成されますが、GetBinder1 回だけ呼び出されます (モデル内の各プロパティではなく、複雑なモデル パラメーターに対して)。DateTimeModelBinderこれは理にかなっていますが、非 DateTime プロパティのデフォルト バインディングを使用しながら、DateTime プロパティにmy を使用する方法を見つけたいと思います。デフォルトをオーバーライドして、ModelBinder各プロパティのバインド方法を指定する方法はありますか?

ありがとう!!!

4

1 に答える 1

1

ビューモデルのDateプロパティを次のように設定することを検討してくださいstring

次に、ビューモデルタイプとドメインモデルタイプの間のマッピングを処理するユーティリティ関数を記述します。

public static MyCriteria MapMyCriteriaViewModelToDomain(MyCriteriaViewModel model){

    var date = Convert.ToDateTime(model.Date.Substring(0,2) + "/" model.Date.Substring(2,2) + "/" model.Date.Substring(4,2));

    return new MyCriteria
    {
        ID = model.ID,
        Date = date
    };

}

または、次のようなAutoMapperなどのツールを使用します。

Global.asaxで

//if passed as MMDDYYYY:
Mapper.CreateMap<MyCriteriaViewModel, MyCriteria>().
    .ForMember(
          dest => dest.Date, 
          opt => opt.MapFrom(src => Convert.ToDateTime(src.Date.Substring(0,2) + "/" src.Date.Substring(2,2) + "/" src.Date.Substring(4,2)))
);

およびコントローラー内:

public ActionResult MyAction(MyCriteriaViewModel model)
{
    var myCriteria = Mapper.Map<MyCriteriaViewModel, MyCriteria>(model);

    //  etc.
}

この例から、AutoMapperが付加価値を提供していないように見える場合があります。この値は、通常、この例よりも多くのプロパティを持つオブジェクトを使用して複数または多数のマッピングを構成する場合に役立ちます。CreateMapは、同じ名前とタイプのプロパティを自動的にマップするため、多くの入力を節約でき、はるかに乾燥します。

于 2012-08-09T17:54:32.207 に答える