2014-02-11 83 views
0

我有一些代碼如下;在C#中的RedirectToAction是否昂貴?

我們將創建一個Note,但是當我們這樣做時我們可能知道CustomerId我有兩個URL;

public ActionResult CreateByCustomer(int id)           
{ 
    Session["ncAppointmentId"] = 0; 
    Session["ncNoteDate"] = null; 

    SetConsultant(0); 
    return RedirectToAction("Create", "Note", new { id = id }); 
} 

public ActionResult Create(int id = 0) 
{ 
    int _CustomerId = id == 0 ? Convert.ToInt32(Session["CustomerId"]) : id; 
    Session["TemplateIds"] = null; 
    and so on....... 
    ViewBag.CustomerId = _CustomerId; 

當我看着螢火蟲的表現RedirectToAction導致了「302找到」狀態,可招致長達1秒鐘的延遲一個GET。

如果我更改了RedirectToAction線

return Create(0); 

然後GET不會發生,並提高性能。

但我在尋找意見是什麼缺點或我錯過了什麼?

回答

2

RedirectToAction結果告訴客戶端請求一個新的頁面,所以它自然會產生開銷,因爲客戶端現在不得不向您的服務器發出第二個請求。有時這是必要的,有時候 - 如你的例子 - 不是。

通常我使用RedirectToAction在執行諸如創建筆記之類的操作之後將客戶端返回到特定頁面。如果您在列出筆記的頁面上,並且您希望在創建新頁面後刷新頁面,這會非常有用。最終結果是刷新頁面,並且Create操作未出現在用戶的瀏覽器歷史記錄中。

如果您的Create方法返回View,可能會有一些直接調用它的有趣副作用。一般來說,MVC代碼會處理它,但是你可能會得到一些奇怪的結果 - 比如客戶端的URL與你在後面的請求中所期望的不一樣,等等。如果你確定,這很好。

另一個選擇是擺脫CreateByCustomer動作,並簡單地用名爲customerID的參數調用Create視圖。這使您能夠以不同的方式調用它,而不必擁有多個入口點。客戶的位置將反映(在查詢字符串中)CreateCreate?customerId=12345之間的差異,這可能是也可能不是你所追求的。


<意見>
一些樣式注:

  • 如果你存儲大量會話數據的,創建一個類來代替持有它在創造許多條目的Session[]

  • 使用jQueryUI爲筆記創建頁內編輯器而不是定義視圖並不特別困難 - 請檢查this example。更優雅太:P

< /意見>

+0

感謝你,我的想法了寶貴的確認。 回覆:jQueryUI - 可以用於簡單的編輯,但使用IFrame可以提供更好的進程隔離和可重用性 –

1

RedirectToAction方法將返回一個具有Found狀態碼的HTTP響應和一個指向您重定向客戶端的位置的Location URL。成本只是另一個GET請求,我不認爲這很貴。重定向與否的決定應基於它是否在概念上有意義,而不是基於是否減少一個GET請求。

但是,我並不完全理解這裏的動機。如果你詳細說明你爲什麼試圖重定向,也許我可以幫你選擇一個更有意義的模式。

通常,您不會在HTTP API中命名方法Create*。正確的前綴是Post*Put*,這取決於您是分別添加新資源(但是命名它)還是創建/替換資源(並命名它)。

0

最大的區別在於您是否希望url更改爲「創建」一個。如果可以顯示您使用該網址顯示的任何內容,請避免重定向。重定向在你有一箇舊url時很有用,你希望它指向一個新的URL,並且在你想避免在用戶刷新de頁面時保存新東西的情況下(因爲它只刷新重定向請求而不是刷新後)。