【问题标题】:Is there any way to set ActionName in QueryString in ASP.NET MVC 5?有没有办法在 ASP.NET MVC 5 的 QueryString 中设置 ActionName?
【发布时间】:2017-02-01 02:46:13
【问题描述】:

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

我想知道有没有办法像example.com/controller?aciton=index&param1=value1&param2=value2(notice action=index in query string) 一样将操作名称放入查询字符串中,并使 ASP.NET MVC 路由对应控制器和动作的url。查询名称的名称可以是action 或其他名称。

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

通过搜索,我得到了一些解决方案:

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

【问题讨论】:

  • 我建议尝试一下路由配置。如果它不能直接通过路由实现,那么您可以将其路由到一个“处理程序”操作,该操作评估 action 参数并重定向到指定的操作。这应该足够简单
  • 一般路由配置中的路由不能配置查询字符串。如果您尝试这样做,它将引发错误。我不确定是否有办法推翻路由的主要约定。您是否有理由要这样做,它使 MVC 的约定变得多余。
  • 您不需要在路由配置中配置查询字符串,MVC 还会检查查询字符串并将其映射到您的操作参数,假设您具有与查询字符串名称匹配的参数名称

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


【解决方案1】:

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

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>

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2017-09-22
    • 2015-10-18
    • 2010-09-26
    相关资源
    最近更新 更多