如果GET和POST方法共享相同的名称,有没有办法在GET操作中生成post URL?

时间:2014-01-07 21:28:28

标签: asp.net-mvc

如果GET和POST方法共享相同的名称,有没有办法在GET操作中生成帖子URL?

需要在控制器中生成post URL的原因是我们不处理视图,而只提供包含JSON形式的有效负载的ViewModel。并且前端需要知道将表单值发布到哪里。

[HttpGet]
public ActionResult MethodName(string id)
{
...
}

[HttpPost]
public JsonResult MethodName(ViewModel model)
{
...
}

e.g。获取URL将是:

  

/控制器/方法名/ 123

,帖子网址为:

  

/控制器/方法名

在获取操作中,我需要向前端提供将使用表单值的帖子URL。

使用Url.Action("methodname", "controller", new { id = string.Empty})会生成一个与帖子网址相同的网址,但它有点像黑客的方式

另一种选择是为post方法定义路由,并使用Url.RouteUrl("PostMethodName")生成URL。

这些都不是理想的,那么还有另一种(更干净的)方法来完成这项工作吗?

2 个答案:

答案 0 :(得分:1)

沃尔特,

我无法理解这是怎么回事“hack-ish”。您正在使用强类型模型提供受限制的帖子操作,唯一的区别在于您的操作结果类型。如果您愿意,URL可以是相同的。

另外,你可以为你的aJax方法创建一个动作,例如。

[HttpPost]
public JsonResult ajaxMethod(ViewModel model){
  //...
}

这仅限于HttpPost方法并包含您的视图模型。动作不需要视图,只需返回动作结果。如果你想获得非常简单的行动,那么object可以返回任何动作。您执行此操作的路线与所有其他路线类似:

@Url.Action("ajaxMethod", "controller") 

生成

/controller/ajaxMethod

我可能完全错过了这个问题,请告诉我这是否有帮助。

编辑:从评论更新。

如果您想在控制器操作中生成路线或操作网址,只需添加,您就可以在操作中使用Url帮助程序,例如。

ViewBag.Url = Url.Action("MethodName", "Controller");

答案 1 :(得分:0)

另一种选择是创建自定义Route实现。一个非常基本的,包括一行来解决您的问题(删除现有的路由参数)可能如下所示:

public class CustomRoute : Route
{
    public CustomRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler)
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData == null)
        {
            return null;
        }

        /* custom implementation here */

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        /*
         * GetVirtualPath is called until a suitable route is found.
         * This means modifying the passed RouteValueDictionary has consequenses for subsequent calls.
         * Therefore, always work with a copy if you want to modify any values: new RouteValueDictionary(values)
         */

        /*
         * Drop the existing route parameters. Implicitness can only cause confusion.
         */
        requestContext = new RequestContext(requestContext.HttpContext, new RouteData());

        return base.GetVirtualPath(requestContext, values);
    }
}

您可能还希望自定义路由采用MapRoute方法。为此,您只需查看original implementation,复制粘贴并将Route替换为CustomRoute