Ajax.ActionLink和“action”参数 - 奇怪的行为

时间:2014-12-18 14:58:29

标签: c# ajax asp.net-mvc-5 actionlink

我使用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解决了问题。

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

我已完成一些测试,并且ActionLink的Action参数始终覆盖action参数。 我认为框架中有一些东西会覆盖这个让你无用的参数。

我使用controller参数进行了相同的测试,例如

 @Html.ActionLink("Register", "ActionName",routeValues: new {@action="fakeAction".ToString(CultureInfo.InvariantCulture), controller="fakeController".ToString(CultureInfo.InvariantCulture)})

这些参数会覆盖当前控制器并破坏在fakeAction控制器

内搜索的actionLink链接

如果我只在控制器中留下动作参数

public ActionResult Register(string action)
{
      return View();
}

输入中的操作参数始终为"Register"而不是"fakeAction"

答案 1 :(得分:1)

这个问题深入.NET框架。在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方法调用。

到目前为止,我们看到隐式或显式操作/控制器名称将替换路由值中的actioncontroller参数,即使它们应该是查询字符串或其他url参数。

不知道为什么M $会这样做,但我想这不是一个错误而不是功能