T4MVC ModelBinding - PullRequest
       17

T4MVC ModelBinding

1 голос
/ 15 февраля 2012

У меня было следующее действие:

public ActionResult GetCityObjects(string cityAlias)

По некоторым причинам я добавил пользовательский ModelBinder:

public ActionResult GetCityObjects(City city)

Теперь я хочу, чтобы T4MVC добавил параметр "cityAlias" со значением city.Alias, когда я передаю параметр города в соответствующий метод T4MVC.Есть ли способ добиться этого?

Ответы [ 3 ]

3 голосов
/ 20 августа 2012

Теперь возможно с функцией T4MVC Model 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());

После этого вы можете обычно использовать MVC.Home.GetCityObjects (city) для генерации URL.

2 голосов
/ 15 февраля 2012

Я так не думаю.

Вам необходимо использовать версию без параметров и добавить значения маршрута вручную:

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

Если вы посмотрите на исходный код, вы увидите, что сгенерированный метод просто добавляет city экземпляр с использованием параметраназвание «город».

0 голосов
/ 15 февраля 2012

Я нашел обходной путь.Я жестко закодировал в 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?

...