Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 为Url.Action指定HTTP谓词?_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 为Url.Action指定HTTP谓词?

Asp.net mvc 为Url.Action指定HTTP谓词?,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我正在使用AttributeRouting: 如果我有两个名称相同的操作,但是GET的路由与POST的路由不同,为什么Url.Action会生成一个与我的GET操作匹配的Url,即使我的操作方法指向的是POST 我试着把这个动词当作一个动词来传递 Url.Action("CreateEdit", new { method = "POST" }) 但是,这将返回字符串/enrollments/create,而不是对应于POST的/enrollments/createedit 我不认为这会起作用,

我正在使用AttributeRouting:

如果我有两个名称相同的操作,但是GET的路由与POST的路由不同,为什么
Url.Action
会生成一个与我的GET操作匹配的Url,即使我的操作方法指向的是POST

我试着把这个动词当作一个动词来传递

Url.Action("CreateEdit", new { method = "POST" })
但是,这将返回字符串
/enrollments/create
,而不是对应于POST的
/enrollments/createedit

我不认为这会起作用,但尝试了一下,因为某些管线配置使用了这种技术:

Url.Action("CreateEdit", new { HttpMethodConstraint = new HttpMethodConstraint("POST") })
然而,这两个都不能解决问题,URL仍然是我的GET路径

我已验证我可以发布到硬编码的URL
/enrollments/createedit
,因此发布操作确实具有该路径,只是为了排除发布操作的默认路径
[post]
默认为预期路径的可能性

问题是我通常避免硬编码的URL,而是使用URL.Action或Html.BeginForm(也有同样的问题),这样所有的URL都是从动作路由派生的

以下是我如何定义我的行为:

[GET("create")]
[GET("edit/{id:guid?}")]      
public ActionResult CreateEdit(Guid? id)
...

[POST] //default to "createedit"
public ActionResult CreateEdit()
...
注意,这个问题不是关于发出实际请求,而是生成路由URL

您如何向Url.Action指示它应该使用来自[POST]的路由而不是GET。不存在接受约束或HTTP谓词的重载?请注意,Html.BeginForm在生成action URL属性时也会出现同样的问题,这显然是一种面向POST的方法

如果我将我的行动路线简化为(尽管以上是我的目标路线),它也不起作用:

Url.Action(“CreateEdit”,new{method=“POST”})
返回“/注册/创建”,这显然是因为
method='POST'
不是为Url.Action指定所需路由的正确方法有没有办法告诉Url.Action或Html.BeginForm指定所需的投递路线?BeginForm的method参数会影响
method=“POST”
Html属性,但操作属性仍然是使用错误的
/enrollments/create
Url生成的。我见过
area=“Admin”
用于在路由参数中指定区域。是否可以添加一些神奇的属性来指定动词?如果没有,那么显然没有办法一致地获得正确的URL,如果需要维护所需的路由,我可能需要重命名我的一个操作。我希望有一些路径值可以添加到
新的{area=“SomeArea”}
method=“POST”
只是我对什么可能有效的猜测

请求管道尊重路由约束,如果它们都是相同的路由,那么它可以正常工作。因此,如果两者都是
[POST(“creatededit”)]
[GET(“create”]
,那么它就可以正常工作,因为两者的URL都是相同的,然后在发出实际请求时,管道会根据httpmethodcontract进行区分

如果我使用参数来区分路由,则只有在消除
[GET(“create”)]

如果Url.Action没有已知/支持/记录的获取路由属性的方法,那么答案可能就是Url.Action无法告诉它所需的动词

  • 如果有人问:有没有办法指定Url.Action的区域
  • 答案很简单:
    Url.Action(“SomeAction”,new{area=“SomeArea”})
  • 答案不是:在你的路线上乱搞,这样你就不会在不同的地方有两个同名的动作(或者其他一些无法解决问题的动作)
  • 答案不是:您不应该在不同的区域中有相同名称的操作(这可能是一个有效的点,但它不会为其他人创建有用的资源,因为他们必须为不同的区域生成URL)
我不明白这有什么复杂的

我不是问如何发出POST请求。我知道如何做,但我不打算将URL硬编码到我的视图中。这会变成维护的噩梦

如果我的老板对SOE没有太大的兴趣,我可以改变我的路线。所以我不能取消[GET(“create”)]路线

我可以通过重命名以下操作来解决此问题:

[GET("create")]
[GET("edit/{id:guid?}")]      
public ActionResult CreateEdit(Guid? id)
...

[POST("createedit")] 
public ActionResult CreateEditPost()
...
这有点脏,但有效。它仍然不能回答问题


如果有一种方法可以指定Url.Action的动词,那么我认为答案将是一个有用的资源。可能没有
Url.Action(“SomeAction”,new{area=“SomeArea”})那么多的人知道
但它将记录Url的一个功能。对我来说,这是一个难以捉摸的操作。也许它不支持它。也许我需要深入研究源代码。

我在我的原始答案中搞错了。我没有真正想清楚,可能回答得太快。归结起来如下:

Url.Action
本质上与控制器/操作样式路由绑定。当有两个匹配的操作时(重载,其中一个是GET版本,另一个是POST),URL应该是相同的,因此返回GET或really first版本。请参阅,AttributeRouting只是通过允许您自定义向外的URL来进行排序,但在内部,
URL。Action
只是试图找到一条路径,将您带到请求的操作。一旦找到匹配项,它会假定这已经足够了,然后特别是在MVC5之前,它应该是

MVC5作为一级公民引入了属性路由,但从我所看到的情况来看,这个边缘案例(同一操作的GET和POST版本具有不同的URL,并且您特别想要POST版本)没有被涵盖

也就是说,我看到了一些潜在的解决办法:

  • 使用不同的操作名称。如果您的操作后
    [GET("create")]
    [GET("edit/{id:guid?}")]      
    public ActionResult CreateEdit(Guid? id)
    ...
    
    [POST("createedit")] 
    public ActionResult CreateEditPost()
    ...
    
    [POST("createedit", RouteName = "CreateEditPost")]
    public ActionResult CreateEdit()
    {
        ...
    }
    
    @Url.RouteUrl("CreateEditPost")