0

コントローラーのモデル パラメーターにフォームをバインドしようとしています。モデルには DateTime フィールドが含まれており、フォームの送信時にそれをバインドしたいと考えています。フォーム フィールドは、日付が非標準形式で入力されることを想定しています (これはさまざまな理由で変更できません)。

コントローラーのアクションは次のとおりです。

public ActionResult Registration_Post(RegistrationDetails model)

RegistrationDetails クラスで (DateTime) DateOfBirth プロパティをカスタム バインドするだけで済みます。残りのすべてのプロパティは、デフォルトのバインディングで機能します。

アプリ全体の DateTime バインディングをオーバーライドしたくありません - この単一のアクション (または、より簡単な場合はコントローラー) のためだけに。

どうすればこれを行うことができますか?次のように、アクションで ModelBinder 属性を使用してみました。

public ActionResult Registration_Post([ModelBinder(typeof(CustomDateTimeBinder)]RegistrationDetails model)

ただし、RegistrationDetails クラス全体のカスタム バインダーを作成する必要があるようです。これはやり過ぎのようです。

また、クラスが他の場所で使用されているため、モデル プロパティにカスタム フォーマットを設定したくないため、クラスを汚染しています。

MVC4を使用しています。

誰かがこれを処理する最良の方法を教えてもらえますか?

4

1 に答える 1

0

これを試してください: カスタム モデル バインダー プロバイダーを作成します。

BindModel メソッドでは、Registration_Post アクションからの生年月日のみが特別な形式であるという要件に対処するためのロジックを追加する必要があります。ところで、モデル全体をバインドする必要があります。

using System;
using System.Web.Mvc;
using MvcApp.Models;

public class CustomModelBinderProvider : IModelBinderProvider 
{
    public IModelBinder GetBinder(Type modelType) 
    {
        return modelType == typeof(Person) ? new PersonModelBinder() : null;
    }
}

protected void Application_Start()
{    
    ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider());    
}


public class PersonModelBinder : IModelBinder 
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext   
                            bindingContext) 
   {
         //add logic here to bind the person object
   }
于 2013-04-05T17:02:28.203 に答える