【问题标题】:Permanent redirect across HTTP methods?跨 HTTP 方法的永久重定向?
【发布时间】:2012-08-25 02:32:39
【问题描述】:

我的CommentsController 中有以下几种方法。

    [HttpGet]
    [Authorize]
    public ActionResult New(long id)
    {
        return RedirectToAction("Details", "Posts", new { id }); // lets be graceful.
    }

    [HttpPost]
    [Authorize]
    public ActionResult New(long id, string comment, IMiniPrincipal principal)
    {
        throw new NotImplementedException();
    }

两者都通过任何posts/{id}/comment 路由解决,其中 id 是一个数值。我添加了GET 操作主要是为了避免混淆(当他们尝试手动访问路由而不是通过POST 表单时,我不只是告诉用户它不存在,而是将他们重定向到评论会的帖子'已提交)。

问题是我是否可以在 HTTP GET 请求中使用永久重定向结果,但在 HTTP POST 请求期间仍然不能永久重定向?

【问题讨论】:

    标签: c# asp.net-mvc-3 redirect routing


    【解决方案1】:

    最好将 POST 处理程序映射到模型,这样可以大大降低相同 URL 映射到两个操作的可能性。

    因此您的代码可能会更改为:

    [HttpPost]
    [Authorize]
    public ActionResult New(CommentModel model)
    {
        // { ...code... }
    }
    

    模型看起来像这样:

    public class CommentModel
    {
        public long ID { get; set; }
    
        public string Comment { get; set; }
    
        public IMiniPrincipal Principal { get; set; }
    }
    

    【讨论】:

    • 我有意添加了 HttpGet 操作,以便将手动请求该路由的用户重定向到实际帖子而不是 404 页面。
    • 使用您指定的属性,您的操作只会映射到与请求类型匹配的方法。因此,即使您发布类似/posts/42/comment 的内容,它也只会映射到带有[HttpPost] 属性的方法。所以……你应该没问题。当然,我刚才提到的示例可能会导致 404...
    • 是的,当用户 GETs posts/42/comment@ 时,我认为您没有我想要重定向到 posts/42 而不是 404ing 的部分
    【解决方案2】:

    永久重定向基于每个方法工作,因此您实际上可以在 POST 上执行永久重定向到给定的 url,同时将 GET 请求上的内容提供到相同的 url。

    【讨论】:

    • 回答我一直在寻找,但是 1) 这是在哪里指定的,2) 我可以相信它们会像这样工作的浏览器吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多