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