我有以下行动:
public ActionResult GetCityObjects(string cityAlias)
由于某些原因,我添加了一个自定义的ModelBinder:
public ActionResult GetCityObjects(City city)
现在我想让T4MVC添加“cityAlias”参数和value city.Alias当我将city参数传递给适当的T4MVC方法时。有没有办法实现它?
答案 0 :(得分:3)
现在可以使用T4MVC Model Unbinder功能(http://t4mvc.codeplex.com/documentation 3.1),您可以为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());
之后,您通常可以使用MVC.Home.GetCityObjects(city)来生成网址。
答案 1 :(得分:2)
我不这么认为。
您需要使用无参数版本并手动添加路线值:
GetCityObjects().AddRouteValue("cityAlias", city.cityAlias)
如果查看源代码,您会看到生成的方法只是使用参数名称“city”添加city
实例。
答案 2 :(得分: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;
}
我不能说我喜欢它,但至少它适用于我的情况。
大卫,你怎么看待将这个更普遍的实现引入T4MVC?