2013-04-05 10 views
12

MyListのカスタムモデルバインダーをglobal.asaxに登録しました。しかし、モデルのバインダーはネストされたプロパティに対しては起動しません。単純な型では正常に動作します。以下の例では、それは(インデックスのために発射する)ではなく(インデックス2のために発生しません)カスタムモデルバインダーが起動しない

Global.asaxの

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    ModelBinders.Binders.Add(typeof(MyList), new MyListBinder()); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
} 

コード:

public class MyListBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     return new MyList(); 
    } 
} 

public class MyList 
{ 
    public List<int> items { get; set; } 
} 

public class MyListWrapper 
{ 
    public MyList listItems { get; set; } 
} 

public class TestController : Controller 
{ 
    public ActionResult Index(MyList list) // ModelBinder fires :-) 
    {    
     return View(); 
    } 

    public ActionResult Index2(MyListWrapper wrapper) // ModelBinder does not fire! :-(
    { 
     return View(); 
    } 
} 
+0

この問題の解決策をお探しですか? –

答えて

0

あなたのモデルバインダーMyListWrapperではなくMyListクラスと一致します。 MyListBinderは、MyListクラスまたはMyClassから継承したクラスでのみ使用されます。

+0

質問ではなく、答えとしてコメントを追加してください。 – newbie

2

モデルバインダーは、複雑なオブジェクトタイプをアクションとしてパラメータとして受け入れるために使用されます。これらの複合型は、フォームを送信するなどして、POST要求によって生成する必要があります。既定のモデルバインダーでバインドできない非常に複雑なオブジェクトがある場合(または効果がない場合)は、カスタムモデルバインダーを使用できます。あなたもMyListWrapperクラス用のカスタムモデルバインダーを追加しない場合は、MyListBinder)のBindModelが(これはどのようにASP.NETで、GETリクエストで呼び出されることはありません :あなたの質問に答えるために

MVCは動作します。 をしかし、あなたはMyListWrapperパラメータでPOSTアクションを追加することによって、あなたのコードを変更した場合、あなたはBindModelメソッドが適切に呼び出されたことがわかります。

[HttpGet] 
public ActionResult Index2() // ModelBinder doesn't fire 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Index2(MyListWrapper wrapper) // ModelBinder fires 
{ 
    return View(); 
} 

そしてインデックス2ビュー

@model fun.web.MyListWrapper 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.listItems) 
    <input type="submit" value="Submit" /> 
} 

GETリクエストのアクションパラメータを「制御する」には、action filtersを使用してください。

+0

POSTリクエストでも、MyListWrapperバインダーを正しく追加しない限り、バインダーは起動しません。 – newbie

+0

MyListWrapperのバインダーでも、GETとPOST要求の両方でMyListWrapperバインダーが起動しますが、MyListBinderは起動しません。 – newbie

+0

ポイントが取得またはポストされていませんが、バインダーは登録されていなければなりませんそれについて...これを行う最良の方法は、他の回答に示唆されているように、モデルバインダーJUSTをMyListという単一のデータ型に登録することです。 –

1

は、グローバルにこれを追加します。その後、

ModelBinders.Binders.Add(typeof(MyListWrapper), new MyListWrapperBinder()); 

とバインディングを扱うことができるMyListWrapperBinderを作成します。

+1

質問は、カスタムタイプが別のタイプのプロパティである場合に発生することです。 – newbie

+1

要するに、あなたのActionMethodに渡されているどんなタイプのものであれ、ModelBinderが必要です。 –

1

バインダーをMyListに定義したため、アクションメソッドの入力パラメーターがMyListの場合にのみトリガーされます。 、場合でも、それはMyListタイプに遭遇した時はいつでも

[ModelBinder(typeof(MyListBinder))] 
public class MyList 
{ 
    public List<int> items { get; set; } 
} 

次に、モデルバインダーがトリガー:あなたはモデルバインダーは、あなたのMyListが他のモデルにネストされている場合でも、トリガしたい場合は

ModelBinders.Binders.Add(typeof(MyList), new MyListBinder()); 

、あなたはこれをしなければなりませんそれはネストされています。

+0

Mylistのモデルバインダーを起動するために質問に答えません。属性を追加する必要はありません。 MyListがMyListWrapperのプロパティである場合、これによってモデルバインダーがトリガーされますか? – newbie

関連する問題