T4MVC ModelBinding

时间:2012-02-15 08:44:01

标签: .net asp.net-mvc t4mvc

我有以下行动:

public ActionResult GetCityObjects(string cityAlias)

由于某些原因,我添加了一个自定义的ModelBinder:

public ActionResult GetCityObjects(City city)

现在我想让T4MVC添加“cityAlias”参数和value city.Alias当我将city参数传递给适当的T4MVC方​​法时。有没有办法实现它?

3 个答案:

答案 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?