是否可以使用动作过滤器发送301重定向?

时间:2009-12-11 22:38:14

标签: asp.net-mvc url-routing asp.net-mvc-routing action-filter

我正在编写一个新的asp.net mvc应用程序,我一直在想让我的用户发布他发布的内容的简短网址。这些短网址将在Twitter和评论区等狭窄空间中得心应手。我喜欢这个想法,因为我不是网络短片的忠实粉丝,因为它们太模糊了,你真的不确定你会得到什么。我没有使用url shortener,而是希望让我的客户能够发布:

http://domain.com/p/234

执行301重定向到:

http://domain.com/2009/08/10/this-is-the-content-title

现在,这是一个非常简单的过程,有一些额外的路由和一个自定义的ActionResult。我实现的自定义ActionResult是RedirectToRouteResult上的扩展方法......它相当简单,但仍然有大约20行代码。我玩了相同的功能,只有这次使用ActionFilter。我的动作过滤器如下所示:

public class PermanentRedirectAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 301;
    }
}

我的动作方法看起来像(我删除了一堆代码来简化):

[PermanentRedirect]
public ActionResult ShortUrl(int id)
{
    return RedirectToAction("Post", id);
}

我的问题是:我错过了什么或是这么简单吗?我发现了一些人们希望做类似事情的其他帖子,他们总是创建一个自定义的ActionResult。除了使用较少的整体代码,鉴于此行为可能需要在其他操作方法的其他地方使用,我不明白为什么它不应该是ActionFilter。话虽如此,我对Request和Response对象相当新,所以我不确定我是否遗漏了什么。

1 个答案:

答案 0 :(得分:2)

您展示的代码将正常运行。但是,我建议使用自定义操作结果,而不是使用操作过滤器。

这样做的一个原因是,它将为您的单元测试提供更多信息,因为要验证的内容较少。也就是说,使用自定义操作结果,您可以验证是否使用了正确的结果类型以及是否在其上设置了正确的属性。使用当前设计,您必须单独验证正确应用该属性的操作结果数据

另一个原因是代码更清晰:其他开发人员(或者您在2周内)查看或理解的内容会更少。查看简单的return PermanentRedirectToAction("Post", id)比查看属性返回数据要容易得多。