2

我正在写一个新的asp.net mvc应用程序,我一直在玩弄让我的用户发布简短的简明网址到他发布的内容的想法。这些简短的网址将在Twitter和评论区等局促空间中得心应手。我喜欢这个想法,因为我不是网络缩写者的忠实粉丝,因为他们太模糊,而且你也不知道你会得到什么。它做了301重定向到发送带动作过滤器的301重定向可以吗?

http://domain.com/p/234

:如果不使用短网址我想给我的客户发布的能力

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对象相当陌生,所以我不确定我是否缺少某些东西。

+0

我打算假设由于缺乏回应,没有人对此有任何问题。如果遇到此实现的任何障碍,我会放下一行。 – 2009-12-12 04:49:12

+0

这似乎是相当不错的解决方案,我只是想知道你是否仅仅为了SEO的原因而这样做StatusCode = 301,据我所知你会将这个资源作为一个API公开,所以短URL只会接受HTTP POST和它的不打算将其用作抓取工具和一般用户的GET。 – JOBG 2009-12-13 05:41:49

+0

你对SEO的原因是正确的。我希望他能够在Twitter上发布http://domain.com/p/245,而不必使用缩写,并且仍然可以通过http:// 2009/12/12/any将搜索引擎索引。我对你的GET和POST思想感到困惑。我有这个目前作为一个GET的短URL路由,然后做301重定向。不知道你将如何实现这与POST。 – 2009-12-14 04:54:41

回答

2

您显示的代码将工作得很好。不过,我建议使用自定义操作结果,而不是使用操作筛选器。

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

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

+0

好点...我在跳入之前考虑了场景的可测试性,但由于我只是在Firebug中检查重定向的状态代码,以确保它发送了301我想我可以在单元测试中测试正确的RedirectToAction,并且偷看在Firebug看到301. – 2009-12-28 08:23:41

+0

我看到的自定义动作结果的另一个问题是,我觉得这种情况太过“沉重”了。我不觉得这是一个完全“新”的格式,它应该有自己的行动结果,而只是对RedirectToAction的现有功能进行微调......谢谢你的想法! – 2009-12-28 08:30:56