使用T4MVC定制模型活页夹

时间:2011-04-16 17:29:51

标签: c# asp.net-mvc asp.net-mvc-routing modelbinders t4mvc

我的MVC应用程序中有自定义模型绑定器,但我不知道我可以使用T4MVC。

Usualy我会这样叫我的行动:

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;
        }

我该怎么办?我不希望在我的路线中有魔法弦......

谢谢!

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

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

答案 1 :(得分:1)

现在使用ModelUnbinders可以实现同样的目标。 您可以实现自定义取消绑定:

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(合约)来生成网址。