我在一个项目中使用Ajax.ActionLink
助手进行了几次 Ajax 调用,如下所示:
@Ajax.ActionLink("Edit", "MyEditAction", "MyController", new {id = item.Id, action = item.Action}, new AjaxOptions {HttpMethod = "POST"})
奇怪的是 = action
参数被过滤掉了 URL 参数,即使我将其重写为 @action = item.Action
.但是重命名此参数例如act
可以解决问题。
有人知道为什么会这样吗?
我已经做了一些测试,动作参数总是被动作链接的动作参数覆盖。我认为框架中有一些东西覆盖了这个参数,使你的参数变得无用。
我已经用这样的参数做了同样的测试controller
@Html.ActionLink("Register", "ActionName",routeValues: new {@action="fakeAction".ToString(CultureInfo.InvariantCulture), controller="fakeController".ToString(CultureInfo.InvariantCulture)})
这些参数将覆盖当前控制器并断开在控制器内部搜索的 actionLink 链接fakeAction
如果我只在控制器中保留动作参数
public ActionResult Register(string action)
{
return View();
}
输入中的操作参数始终"Register"
而不是"fakeAction"
问题在于.NET Framework。程序集中有一个类RouteValuesHelpers
System.Web.Mvc
,具有以下方法
public static RouteValueDictionary MergeRouteValues(string actionName, string controllerName, RouteValueDictionary implicitRouteValues, RouteValueDictionary routeValues, bool includeImplicitMvcValues)
{
// Create a new dictionary containing implicit and auto-generated values
RouteValueDictionary mergedRouteValues = new RouteValueDictionary();
if (includeImplicitMvcValues)
{
// We only include MVC-specific values like 'controller' and 'action' if we are generating an action link.
// If we are generating a route link [as to MapRoute("Foo", "any/url", new { controller = ... })], including
// the current controller name will cause the route match to fail if the current controller is not the same
// as the destination controller.
object implicitValue;
if (implicitRouteValues != null && implicitRouteValues.TryGetValue("action", out implicitValue))
{
mergedRouteValues["action"] = implicitValue;
}
if (implicitRouteValues != null && implicitRouteValues.TryGetValue("controller", out implicitValue))
{
mergedRouteValues["controller"] = implicitValue;
}
}
// Merge values from the user's dictionary/object
if (routeValues != null)
{
foreach (KeyValuePair<string, object> routeElement in GetRouteValues(routeValues))
{
mergedRouteValues[routeElement.Key] = routeElement.Value;
}
}
// Merge explicit parameters when not null
if (actionName != null)
{
mergedRouteValues["action"] = actionName;
}
if (controllerName != null)
{
mergedRouteValues["controller"] = controllerName;
}
return mergedRouteValues;
}
通过UrlHelper.GenerageUrl
方法调用。
到目前为止,我们看到隐式或显式操作/控制器名称将替换路由值中的action
或controller
参数,即使它应该是查询字符串或其他 url 参数。
不知道为什么 M$ 这样做,但我想这更像是一个错误而不是功能