【问题标题】:Can route values be bound to values other than components of the URL?路由值可以绑定到 URL 组件以外的值吗?
【发布时间】:2013-06-26 09:31:18
【问题描述】:

在 ASP.NET MVC 4 中是否有一种方法可以绑定来自路由 URL 中占位符以外的源的路由值:例如标头或发布数据?还是它们本质上与 URL 耦合?

具体来说,我有兴趣使用已发布表单字段中的值覆盖 action 路由值。这样,您可以轻松地在页面上拥有不同的提交按钮,通过为每个按钮指定 actionname 和操作名称的 value 来调用控制器上的不同操作。

我已尝试将RouteData.Values 设置为HttpModule,但这似乎为时过早,无法覆盖该操作。

【问题讨论】:

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


    【解决方案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());
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 2021-05-29
      • 1970-01-01
      • 2013-07-04
      • 2013-03-13
      • 2012-09-13
      • 2023-02-25
      • 1970-01-01
      • 2018-01-04
      相关资源
      最近更新 更多