переплет пользовательской модели с T4MVC

У меня есть пользовательское связывание моделей в моем приложении MVC, но я не знаю, могу ли я использовать с ним T4MVC.

Обычно я бы назвал свое действие следующим образом:

return RedirectToAction("Edit", "Version", new {contractId = contract.Id.ToString()});

С T4MVC это должно быть так:

return RedirectToAction(MVC.Version.Edit(contract));

Но поскольку T4 не знает о моем связующем, он пытается отправить объект в URL-адресе, но я хочу, чтобы он сгенерировал URL-адрес следующим образом: Contract/{contractId}/Version/{action}/{version}

Также обратите внимание, что у меня есть собственный маршрут:

routes.MapRoute(
                "Version", // Route name
                "Contract/{contractId}/Version/{action}/{version}", // URL with parameters
                new { controller = "Version", action = "Create", version = UrlParameter.Optional } // Parameter defaults
            );

Это мой переплет:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var contractId = GetValue(bindingContext, "contractId");
            var version = GetA<int>(bindingContext,"version");

            var contract = _session.Single<Contract>(contractId);
            if (contract == null) 
            {
                throw new HttpException(404, "Not found");
            }
            var user = _authService.LoggedUser();
            if (contract.CreatedBy == null || !contract.CreatedBy.Id.HasValue || contract.CreatedBy.Id.Value != user.Id)
            {
                throw new HttpException(401, "Unauthorized");
            }

            if (contract.Versions.Count < version)
            {
                throw new HttpException(404, "Not found");
            }
            return contract;
        }

Что я должен делать? Я не хочу, чтобы на моем маршруте была волшебная нить...

Спасибо!


person VinnyG    schedule 16.04.2011    source источник


Ответы (2)


Попробуйте что-то вроде этого:

return RedirectToAction(MVC.Version.Edit().AddRouteValues(new {contractId = contract.Id.ToString()}));
person David Ebbo    schedule 18.04.2011

Теперь того же можно добиться с помощью ModelUnbinders. Вы можете реализовать собственный unbinder:

public class ContractUnbinder : IModelUnbinder<Contract>
{
    public void UnbindModel(RouteValueDictionary routeValueDictionary, string routeName, Contract contract)
    {
        if (user != null)
            routeValueDictionary.Add("cityAlias", contract.Id);
    }
}

а затем зарегистрируйте его в T4MVC (из Application_Start):

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

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

person Shaddix    schedule 20.08.2012