有没有办法在ASP.NET MVC 5中的QueryString中设置ActionName?

时间:2016-09-23 09:33:41

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

我们都知道ASP.NET MVC中的url总是像example.com/controller/action?param1=value1&param2=value2

我想知道有没有办法将动作名称放在查询字符串中,就像example.com/controller?aciton=index&param1=value1&param2=value2一样(在查询字符串中注意 action = index ),然后制作ASP。 NET MVC将url路由到相应的控制器和动作。查询名称的名称可以是action或其他名称。

--- 9月28日更新---
实际情况是我有一个表单,表单内部是一个带有单选按钮的表,每个列和表上方的一些按钮(创建,编辑,删除等)。这些按钮在同一个控制器中进行不同的操作。

作为搜索的结果,我得到了一些解决方案:

  1. 通过JavaScript处理onsubmit并更改表单的action属性。 Answer link
  2. 写一条"路线"控制器中重新路由请求的方法。 Answer link(我认为这不是一个优雅的解决方案)
  3. 编写一个自定义属性让ASP.NET MVC根据查询路由到相应的操作。 This anwserthis answer(非常接近我最初的想法,我目前正在使用此解决方案)

1 个答案:

答案 0 :(得分:0)

我是提问者,在我更新问题几个小时后,我终于找到了解决方案。那是写一个自定义路线。

public class QueryActionRoute : Route
{
    public QueryActionRoute(string url, object defaults) : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler()) { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        var action = httpContext.Request["action"];
        if (routeData != null)
        {
            if (!string.IsNullOrEmpty(action))
            {
                routeData.Values["action"] = action;
            }
        }
        else
        {
            routeData = new RouteData()
            {
                Values = { {"action", "Index"} }
            };
        }
        return routeData;
    }
}

并替换默认路线

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.Add(
            "Default",
            new QueryActionRoute(
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }));
    }
}

之后,您可以通过
访问某个操作 example.com/home/about?param=value(如果动作是“索引”,你可以发出动作名称),就像之前一样 或
example.com/home?action=about&param=value

当您需要指定不同的按钮以在表单中执行不同的操作时,我真的很有帮助。你可以这样做:

<form action="@Url.Action("Index")">
    <button name="action" value="Create">Create</button>
    <button name="action" value="Details">Detail</button>
    <button name="action" value="Edit">Edit</button>
    <button name="action" value="Delete">Delete</button>
</form>