2012-02-15 12 views
1

は、私は、次のアクションを持っていました適切なT4MVCメソッドに都市パラメータを渡すとき。それを達成する方法はありますか?T4MVC ModelBinding

答えて

3

それはそのようCityタイプのカスタムunbinder T4MVCモデルUnbinder機能(http://t4mvc.codeplex.com/documentation 3.1)、あなたが実装することができて、今可能です:

public class CityUnbinder : IModelUnbinder<City> 
{ 
    public void UnbindModel(RouteValueDictionary routeValueDictionary, string routeName, City city) 
    { 
     if (user != null) 
      routeValueDictionary.Add("cityAlias", city.Alias); 
    } 
} 

、その後に登録(のApplication_Startから)T4MVC:

ModelUnbinderHelpers.ModelUnbinders.Add(new CityUnbinder()); 

は、その後、あなたは、通常のURLを生成するためのMVC.Home.GetCityObjects(都市)を使用することができます。

2

私はそうは思わない。

あなたはパラメータなしのバージョンを使用して、手動でルート値を追加する必要があります。

GetCityObjects().AddRouteValue("cityAlias", city.cityAlias) 

あなたがソースコードを見ると、あなたが生成されたメソッドだけで、パラメータ名「都市」を使用してcityインスタンスを追加していることがわかります。

0

解決方法が見つかりました。私はT4MVCに次のハードコードされている:

<#foreach (var method in controller.ActionMethods) { #> 
     public override <#=method.ReturnTypeFullName #> <#=method.Name #>(<#method.WriteFormalParameters(true); #>) { 
      var callInfo = new T4MVC_<#=method.ReturnType #>(Area, Name, ActionNames.<#=method.ActionName #>); 
<#if (method.Parameters.Count > 0) { #> 
<#foreach (var p in method.Parameters) { #> 
<# if (p.Name != "city") { #> 
     callInfo.RouteValueDictionary.Add(<#=p.RouteNameExpression #>, <#=p.Name #>); 
<# } #> 
<# else #> 
<# { #> 
     callInfo.RouteValueDictionary.Add("cityAlias", city.Alias); 
<# } #> 
<#} #> 
<#}#> 
      return callInfo; 
     } 

私はそれが好きと言うことはできませんが、少なくともそれは私の場合で動作します。

David、もっと一般的な実装をT4MVCに導入するとどう思いますか?

+0

それは原則的に良いと思う!残念ながら私はT4MVCで作業するためのリソースが限られているだけなので、これに取り組む時間を持つ貢献者を見つける必要があります。私はすぐに明らかな修正を加えてバグを修正しようとしています。 –

+0

@DavidEbbo、私はそれを実装するための時間を見つけることができれば願っていますが、最初に実装するものについて議論したいと思います。同様のケースを一般化し、それらをカバーする最良の方法を見つけることは素晴らしいことです – SiberianGuy

関連する問題