ASP.NET MVC 4中是否有一种方法可以绑定路由URL中占位符以外的来源的路由值:例如标题或帖子数据?或者他们内在地耦合到URL?
具体来说,我有兴趣使用已发布的表单字段中的值覆盖action
路由值。这样,您可以轻松地在页面上设置不同的提交按钮,通过为每个操作名称name
action
和value
提供RouteData.Values
来控制控制器上的不同操作。
我已尝试在HttpModule
中设置{{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());