路由值是否可以绑定到URL组件以外的值?

时间:2013-06-26 09:31:19

标签: asp.net-mvc asp.net-mvc-4

ASP.NET MVC 4中是否有一种方法可以绑定路由URL中占位符以外的来源的路由值:例如标题或帖子数据?或者他们内在地耦合到URL?

具体来说,我有兴趣使用已发布的表单字段中的值覆盖action路由值。这样,您可以轻松地在页面上设置不同的提交按钮,通过为每个操作名称name actionvalue提供RouteData.Values来控制控制器上的不同操作。

我已尝试在HttpModule中设置{{1}},但在管道中显示为了覆盖此操作还为时过早。

1 个答案:

答案 0 :(得分:1)

HttpModule确实为时尚早,实际上并不需要。您可以依赖常规的MVC路由处理机制,只需为其提供从HTTP请求中提取的自己的RouteValues

例如:

public class MyHeadersBasedRoute : RouteBase
{
    public const string HEADER_CONTROLLER_KEY = "X-REQUESTED-CONTROLLER";
    public const string HEADER_ACTION_KEY = "X-REQUESTED-ACTION";

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var requestedController = httpContext.Request.Headers[HEADER_CONTROLLER_KEY];
        var requestedAction = httpContext.Request.Headers[HEADER_ACTION_KEY];

        if (String.IsNullOrEmpty(requestedController) || String.IsNullOrEmpty(requestedAction))
            return null;

        var ret = new RouteData(this, new MvcRouteHandler());

        ret.Values.Add("controller", requestedController);
        ret.Values.Add("action", requestedAction);

        // add any extra parameter from request, for example:
        ret.Values.Add("id", httpContext.Request.Form["id"]);

        return ret;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

然后只需在global.asax

中注册即可
 RouteTable.Routes.Add(new MyHeadersBasedRoute());