2012-02-15 320 views
1

我有以下操作:T4MVC ModelBinding

public ActionResult GetCityObjects(string cityAlias) 

通過一些原因,我添加了一個自定義的模型綁定器:

public ActionResult GetCityObjects(City city) 

現在我想讓T4MVC添加 「cityAlias」 參數值爲city.Alias當我將城市參數傳遞給適當的T4MVC方​​法時。有什麼辦法可以實現它嗎?

回答

3

現在已經可以用T4MVC型號Unbinder功能(http://t4mvc.codeplex.com/documentation 3.1),可以實現自定義unbinder爲City類型這樣的:

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

,然後在它註冊T4MVC(來自的Application_Start):

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。儘管我試圖快速修復明顯修復的錯誤。 – 2012-02-17 00:01:05

+0

@DavidEbbo,我希望我能找到一些時間來實現它,但首先我想討論要實現的內容。將相似的案例進行概括並找出涵蓋這些案例的最佳方法是非常好的 – SiberianGuy 2012-02-17 05:16:13