如果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。
这些都不是理想的,那么还有另一种(更干净的)方法来完成这项工作吗?
答案 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
。