2014-07-12 29 views
1

我想製作刪除鏈接安全的內容。即。AntiforgeryToken&許多形式perf

行1

編輯刪除

行2

編輯刪除

其中刪除鏈接插入鏈接。

要刪除鏈接POST請求,而不是得到的請求,我可以用一個AntiForgeryToken和AntiForgeryToken驗證

using(Html.BeginForm("Delete","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 
      <input type="submit" value="Delete" /> 
    } 

C#

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int objectId) 
{ 
     SafeLogic(); 
     return View(...); 
} 

配對一個簡單的表格後要做到這一點

我也想用表來做這件事,但是我對這麼多的令牌產生了一些性能問題,例如。

@for (int i = 0; i < 500; i++) 
{ 
    <tr> 
    <td> Data Row @i </td> 
    <td>  
    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 

      <input type="image" src="img_delete.gif" alt="Delete" /> 
    } 
    </td> 

} 

AntiForgeryTokens的生成代價如何?是許多AntiForgery令牌的生成例如。高達100,將成爲一個問題。有這麼多內聯html表單可以嗎?

+0

我會看下面的@Josh代表什麼 - 用jQuery調用頁面感覺更現代。即使你發佈帖子,那裏的表單也會要求用戶重新加載整個頁面或框架。 – zaitsman

+0

我也想知道答案,當每個人都只是添加javascript來完成無需完成的工作時,它就會讓我很煩惱。它只是增加了不必要的複雜性和脆弱性。 (並不是說我反對那些善於使用javascript的漂亮網站,但它只是這個默認答案,讓我很緊張)。到目前爲止,沒有任何答案直接回答這個問題。 –

+0

太糟糕了,接受的答案不回答關於大量antiforgerytokens成本/性能的問題:( – marapet

回答

1

我有一個個人項目,需要像你這樣的事情。

而不是每個項目可以刪除的表單,我有一個單一的形式與一個防僞造令牌。

@using(Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    {your HTML/Razor} 
} 

的刪除圖標,基本上是一個Ajax調用會激活控制器動作......

public JsonResult Delete(int id) 
{ 
    //delete the item 
    if(success) 
    { 
     return Json(true, JsonRequestBehavior.DenyGet); 
    } 
    else 
    { 
     return Json(false, JsonRequestBehavior.DenyGet); 
    } 
} 

...這行動將返回true或false(成功或失敗)。根據這些信息,我會使用jQuery從表格中刪除項目(在我的例子中是一個格式化的表格列表)。這樣我就不會刷新整個頁面。

可能不適合您的實施,但爲我工作。

我不一定知道哪個是最佳實踐,多個表單或帶有多個提交按鈕的單個表單。有人說,如果這些表格的最終動作指向相同的動作,則不應該使用多種形式。更多的信息:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=html+best+practices+multiple+forms

它可能歸結爲你希望你的html有多漂亮或可讀,例如,如果你有一個頁面有幾個塊,它可能不會是所有的亂。不過,想想一旦你有五個或六個這樣的塊,你的頁面將會如何。

+0

我認爲使用jquery&ajax技術上是強制後操作的正確方法 - 因爲它避免了頁面重新刷新 - 所以我猜我將標記爲答案,從某種意義上說,儘管內聯表單允許我將構建轉化爲一個javascript框架來處理簡單的動作。 – user1778606

+0

@ user1778606我曾經想過同樣的事情,但最近我發現javascript增加了很多的功能,與製作靜態頁面相比,開銷非常低;對於客戶端來說,它看起來更乾淨,因爲它都發生在後臺。 – Josh

0

我在循環之外移動了令牌來避開任何正在進行的perf任務。我仍然不確定很多內聯表單是一個很好的解決方案,甚至比附加腳本或onclick事件更好。只是嘗試一下。

@{var token = @Html.AntiForgeryToken();} 


@for (int i = 0; i < 5; i++) 
{ 


    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.Hidden("text", "Element:" + i) 
      @token 
      <input type="Submit"/> 
    } 
}